PHPからバックグラウンド処理を実行させる

ウェブ画面のレスポンスはどれだけ遅くても数秒程度で帰ってきて欲しい。しかし時間がかかる処理というものもある。その時はフロントエンドの画面では「処理を開始しました」と表示しておき、バックグラウンドで実行プログラムを起動する方法が有効。

PHPの場合、exec関数を使えば、PHPでもJavaでもシェルでもなんでも呼び出せる。

その呼び出し方だが普通に以下のようにコールするのはまずい。

exec(‘/usr/bin/php program.php’);

これだと、program.phpが終了するまで、フロントエンドは待たされることになる。つまりバックグラウンドになっていない。

exec(‘/usr/bin/php program.php &’);

「&」をつけてバックグラウンドで処理しろっ。でもだめ。これでも待たされることになる(これはなぜだかわからないんだけど、実際そうなる)。

exec(‘/usr/bin/php program.php >/dev/null 2>&1′);

正解はこれ。別にリダイレクト先は/dev/nullでなくてもよいし2>&1もなくてもOK。とにかく出力しない、ってことにしておけばよさそうだ。

一応マニュアルにも書いてある。

プログラムがこの関数で始まる場合、 バックグラウンドで処理を続けさせるには、 プログラムの出力をファイルや別の出力ストリームにリダイレクトする必要があります。 そうしないと、プログラムが実行を終えるまで PHP はハングしてしまいます。

文章分かりにくい。まぁ、確認の意味も兼ねて、実証してみた。

1件のコメント

  1. CakePHPで非同期処理を実装する | ユニキャストラボ :

    […] PHPのテクメモ » Blog Archive » PHPからバックグラウンド処理を実行させる […]

コメントを残す


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net