PHPでfork(バックグランド処理)をする方法
ちょいとcronとwgetを使ってバックグラウンド処理を複数行いたいなぁって思って調べてみました。
phpにはperlみたいなforkがデフォルトではないので、自前でそれっぽいのを作ります。
もちろんライブラリで用意されていますが、設定がめんどい。
バックグラウンド処理させたいプログラム
2秒止まってファイルを出力します。
if( $_GET['m'] == "sleep" ){ echo "hoge"; sleep(2); echo "moge"; file_put_contents( "hoge" , "hoge"); exit; }
unix系
wgetを使用してバックグラウンド処理できます。
別にシェルでもOK。最後に「 > /dev/null &」(返り値を破棄して実行)があればいいみたい。
$url = "http://localhost/?m=sleep"; system('wget -t 1 {$url} > /dev/null & ');
windows系
実はすごい曲者(systemやexec関数でバックグランド処理できない!)ですが、ソケットを使用し、GET要求でバックグラウンド処理できます。
$fp = fsockopen ("localhost", 80, $errno, $errstr, 5); if (!$fp) { echo "Error: $errstr ($errno)<br>\n"; } else { socket_set_blocking($fp, false); fputs ($fp, "GET /?m=sleep HTTP/1.0\r\n\r\n"); fclose ($fp); }
URLの要求だけしてあとはバイバイみたいな感じです。
ignore_user_abort(); も調べておくとよりしっかりするでしょう。
最近EeePCなどが流行っているのでそちらをサーバーとして使用する場合は覚えておくと便利かもです。
自分的用途として、サーバーを二台用意して、一つを画像処理サーバーとして利用し、画像がアップロードされたら、とりあえずは、処理中ですよって画像を用意して、バックグラウンドでもう一台のサーバーに画像の処理をお願いする感じで使おうと考えてます。
っといいますか最近iPhoneの壁紙や携帯の待ち受け画像を提供してまして、けっこう画像の拡大縮小リクエストが多いので、さすがに一台のサーバーでPHPだけで処理すると閲覧ユーザーのレスポンスが悪くなるのでってことです。
うまくいくといいなぁ。