PHP でバックグラウンド処理を行う基本的なコードとしては,
system('cmd_here >/dev/null &');
とすることで,別プロセスでコマンドが実行されます.
ここで,apache の再起動が掛かると,この別プロセスで動かしていた処理も,kill されてしまいます.
呼び出し元の PHP は mod_php とします.
この場合,親プロセスが再起動されてしまっても,子プロセスは最後まで処理を続けるためには,どのようなアイデアが考えられるでしょうか?
良回答には,300ポイント差し上げます.
アイデアという程のものではありませんが
正等的手段としての「緩やかな再起動」では条件に合いませんでしょうか?
http://httpd.apache.org/docs/2.2/ja/stopping.html
不正手段としては・・・
下手をすればゾンビを生みかねないので、出来ない事を願いたいです。
出来るというのであれば
それを防ぐ手段も同時に提示していただきたいものですね。
(レンタルサーバなどでゾンビ続発では困りますから・・・)
PHP に限らずですが、Gearman と TheSchwartz という仕組みがありますので、それを利用してはどうでしょうか?
web2.0 時代のジョブキューサーバー Gearman と TheSchwartz の関係について - TokuLog 改めB日記
もともとの形を残したいなら、nohup コマンド経由にするか、
system('cmd_here >/dev/null 2>&1 </dev/null &');
として標準エラーと標準入力も切り離してしまえばよいはずですが試していないので。
とりあえず,実験していて分かったのですが,system を使うバックグラウンド処理は,mod_php では動かなくて,CGI にする必要がありました.
続いて,
system('cmd_here </dev/null >/dev/null 2>&1 &');
はバックグラウンドは問題なく動きますが,親プロセスである Apache のリスタートを行うと,こちらのプロセスも kill されてしまうようです.
ちょっとやっつけな気もしますが,at コマンドを使って,ジョブを予約してしまう,というアイデアを実験してみようと思います.
ありがとうございます.
レンタルサーバだと,他のユーザの事情(設定変更など)により,自分が想定しないところで,Apache の再起動が起こります.
この場合,時間のかかる処理を行っていると,プロセスが中断されてしまうのです.
ゾンビ,あるいは孤児プロセス,放っておけば消えます(OSが消してくれる)から,私は続発しても大きな問題ないのではないかと思っています.もちろん,リソースは無駄に使っていますけど,それはうちのサーバなんで,ハードウェアのリソースを増やすので問題ないです.