PHPからバックグラウンド処理を実行させる
2010/09/04 | 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 はハングしてしまいます。
文章分かりにくい。まぁ、確認の意味も兼ねて、実証してみた。
2012/04/09 at 12:16 PM
[…] PHPのテクメモ » Blog Archive » PHPからバックグラウンド処理を実行させる […]