Please wait...

最新のお知らせ・ニュース


phpでバッチ処理-コードの紹介
<公開日:2011年12月05日>

先回このコーナーで紹介したバッチ処理のソースコードを紹介します。プログラムはバッチ処理プログラムと、バッチ処理用のパラメーターを入力し、バッチ処理の処理状態を表示するプログっラムの、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]

ちなみに、わが社で使っているシステムにバッチ処理をカスタマイズして使っていますが、うまく動いています。例えば、年次処理や月次処理といった、一度に大量にデータを扱うような処理です。
一度お試しください。










どんな小さな事でもまずはお気軽にご相談下さい。お見積もりはいつでも無料で承ります。

この度は数あるホームページ制作会社から、当社のサービスに関心を示して頂き、本当にありがとうございます。 きっと貴社は、信頼できる良いホームページ作成会社をお探しの事と思います。当社は、お客様に心から喜んでいただけるよう「誠実さ」「優しさ」を心がけて仕事に励んでいます。 お客さまの思い描くホームページが完成するよう、精一杯お手伝いさせて頂きますので、ホームページ作成は是非当社にお任せ下さい。

お問い合わせはこちら

富山県・地域密着だからできる安心・丁寧なホームページ作りをお約束します。
Copyright (C) 2016 Awake Computer All Rights Reserved.