先回このコーナーで紹介したバッチ処理のソースコードを紹介します。プログラムはバッチ処理プログラムと、バッチ処理用のパラメーターを入力し、バッチ処理の処理状態を表示するプログっラムの、2つのプログラムから成り立っています。なお、サーバーの環境はレッドハットエンタープライズ バージョン5(RHEL5)です。
—————————————————————————————————————-
まず、バッチ処理の方は次のとおりです。プログラム名はsample2-batch.phpです。これはサンプルテスト用プログラムなので、別に何かの処理をしているわけではありません。ただ、1秒間に1回秒数を表示し、10秒間でプログラムが終わるようになっているだけです。実際には、この1~10までループさせているところに、バッチ処理を埋め込むことになります。
(sample2-batch.phpプログラムのはじまり)
[php toolbar=”on”]
<?php
/*
========================================================================
batch sample
========================================================================
*/
/* 処理年度—-*/
$ope_year = $argv[1];
$status_file_name = $argv[2];
echo "処理年度:" . $ope_year . " ステイタスファイル名:" . $status_file_name . "–>>";
/* batch program ———*/
for ($i=0; $i<=9; $i++) {
echo $i;
sleep(1);
}
echo "\n";
/* 終了処理————-*/
$f_pt=fopen($status_file_name,"w");
fwrite($f_pt,"1");
fclose($f_pt);
?>
[/php]
そしてバッチ処理用のパラメーターを入力し、バッチ処理の処理状態を表示するプログっラムを以下に紹介します。プログラム名はsample2.phpです。マルチタスクができるよう、ワークファイルにはtempnam関数を用いています。ただ、セッション情報を用いてタイミングを図っているため、同じブラウザー上で、別のタブを開いて同時にタスクを実行することはできません。実際そのようなことをすることはないと思いますが、どうしてもしたいというのであれば、セッションの代わりに、他の引数と同様、tempnam関数を用いてタイミングを計れば、解決できます。
(sample2.phpプログラムのはじまり)
[php]
<?php session_start();
/*————————————————
[変数の説明]
$ope_mode—> ブラウザー画面の状態
0:初期記入力画面
1:処理中の画面
2:処理終了時の画面
$_SESSION["sample2_boot"] —> バッチプログラムを起動させるためのフラグ。
0:起動済み
1:未起動
[ファイルの内容]
sample2_count.txt…. : 処理中の画面の表示回数。1秒に1回の表示なので、処理開始からの秒数を表す。
sample2_status.txt… : バッチ処理中の状態。バッチ処理中は"0",終了すると"1"になる。
各ファイルはプログラムから書き込み可能なようにパーミッションを設定しておくこと。
————————————————–*/
if (isset($_POST["ope_mode"])) {
$ope_mode=$_POST["ope_mode"];
$_SESSION["sample2_mode"]=$ope_mode;
} else {
if (!isset($_SESSION["sample2_mode"])) {
$ope_mode = 0;
$_SESSION["sample2_mode"] = 0;
} else {
$ope_mode = $_SESSION["sample2_mode"];
}
}
if (isset($_POST["count_file_name"])) {
$count_file_name=$_POST["count_file_name"];
} else if (isset($_GET["count_file_name"])) {
$count_file_name=$_GET["count_file_name"];
}
if (isset($_POST["status_file_name"])) {
$status_file_name=$_POST["status_file_name"];
} else if (isset($_GET["status_file_name"])) {
$status_file_name=$_GET["status_file_name"];
}
if (isset($_GET["work_file_name"])) {
$work_file_name=$_GET["work_file_name"];
}
if ($ope_mode==0) {
$count_file_name = tempnam("/tmp","sample2_count.txt.");
chmod($count_file_name,0777);
$status_file_name = tempnam("/tmp","sample2_status.txt.");
chmod($status_file_name,0777);
$f_pt=fopen($count_file_name,"w");
fwrite($f_pt,"0");
fclose($f_pt);
$f_pt=fopen($status_file_name,"w");
fwrite($f_pt,"0");
fclose($f_pt);
$_SESSION["sample2_boot"]=1;
} else if ($ope_mode==1) {
if ($_SESSION["sample2_boot"]==1) {
/* 最初にバッチ処理をブートさせる ————————–*/
/* バッチ処理のシェルは、バックグラウンド処理とすること。—*/
/* また標準出力はワークファイルにリダイレクトする———–*/
/* 値を渡したい場合は、引数により渡す———————–*/
$batch_sh_file_name=tempnam("/tmp","sample2.sh.");
chmod($batch_sh_file_name,0777);
$work_file_name=tempnam("/tmp","work.txt.");
chmod($work_file_name,0777);
$f_pt=fopen($batch_sh_file_name,"w");
fwrite($f_pt,"/usr/bin/php /var/www/html/php-batch/sample2-batch.php $1 $2 > " . $work_file_name . " & \n");
fclose($f_pt);
exec("/bin/sh " . $batch_sh_file_name . " " . $_POST["ope_year"] . " " . $status_file_name);
unlink($batch_sh_file_name);
$_SESSION["sample2_boot"]=0;
}
}
$f_pt=fopen($count_file_name,"r");
$ope_count=fread($f_pt,1024);
fclose($f_pt);
$f_pt=fopen($status_file_name,"r");
$ope_status=fread($f_pt,1024);
fclose($f_pt);
if ($ope_status==1 || $ope_count>=20) {
$ope_mode=2;
$_SESSION["sample2_mode"]=0;
if ($ope_count>=20) {
$error_flag=true;
} else {
$error_flag=false;
}
}
?>
<html>
<head>
<title>sample2</title>
<meta name="generator" http-equiv="content-type" content="text/html"; charset=euc-jp>
<?php
if ($ope_mode==1) {
/* 処理中は、1秒ごとに画面を更新し、処理状況を表示する——————-*/
?>
<meta http-equiv="refresh" content="1;url=sample2.php?count_file_name=
<?php echo $count_file_name; ?>&status_file_name=<?php echo $status_file_name; ?>&work_file_name=
<?php echo $work_file_name; ?>">
<?php
} ?>
</head>
<body>
<br><br>
<?php echo "ope_mode=" . $ope_mode . "—<br>\n"; ?>
<?php
if ($ope_mode==0) {
?>
<form name="cal_form" method="post" action="sample2.php">
<input type="hidden" name="ope_mode" value="1">
<input type="hidden" name="count_file_name" value="<?php echo $count_file_name; ?>">
<input type="hidden" name="status_file_name" value="<?php echo $status_file_name; ?>">
<p>
処理年度:<input type="text" name="ope_year" value="<?php
$today=getdate();
echo $today[year];
?>">
</p>
<input type="submit" value="処理を開始します">
<input type="button" value="メニューに戻る" onClick="location.href=’index.html’">
<?php
} else if ($ope_mode==1) {
?>
<form name="cal_form" method="post" action="sample2.php">
処理時間(秒):<input type="text" style="width:50px;background-color: #E0E0E0; text-align:center;"
name="cal_count" value="<?php echo $ope_count; ?>" read_only>
<br>処理中のファイル内容の表示:
<?php
$f_pt=fopen($work_file_name,"r");
$work_count=fread($f_pt,1024);
fclose($f_pt);
echo $work_count;
?>
<br>
<?php
} else if ($ope_mode==2) {
?>
<form name="cal_form" method="post" action="sample2.php">
<input type="hidden" name="ope_mode" value="0">
<p>
<?php
if ($error_flag) {
?>
処理中にエラーが発生しました。
<?php
} else {
?>
処理が終了しました。
<?php
}
?>
</p>
<input type="submit" value="もとの画面に戻ります">
<?php
}
?>
</form>
</body>
</html>
<?php
if ($ope_mode==1) {
$ope_count++;
$f_pt=fopen($count_file_name,"w");
fwrite($f_pt,$ope_count);
fclose($f_pt);
} else if ($ope_mode==2) {
$_SESSION["sample2_mode"]=0;
$f_pt=fopen($status_file_name,"w");
fwrite($f_pt,"0");
fclose($f_pt);
unlink($count_file_name);
unlink($status_file_name);
unlink($work_file_name);
}
?>
[/php]