PHP でバックグラウンド処理を行うアイデアです.


PHP でバックグラウンド処理を行う基本的なコードとしては,

system('cmd_here >/dev/null &');

とすることで,別プロセスでコマンドが実行されます.

ここで,apache の再起動が掛かると,この別プロセスで動かしていた処理も,kill されてしまいます.

呼び出し元の PHP は mod_php とします.


この場合,親プロセスが再起動されてしまっても,子プロセスは最後まで処理を続けるためには,どのようなアイデアが考えられるでしょうか?

良回答には,300ポイント差し上げます.

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2008/11/19 16:15:28
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:kn1967 No.1

回答回数2915ベストアンサー獲得回数301

ポイント150pt

アイデアという程のものではありませんが

正等的手段としての「緩やかな再起動」では条件に合いませんでしょうか?

http://httpd.apache.org/docs/2.2/ja/stopping.html


不正手段としては・・・

下手をすればゾンビを生みかねないので、出来ない事を願いたいです。

出来るというのであれば

それを防ぐ手段も同時に提示していただきたいものですね。

(レンタルサーバなどでゾンビ続発では困りますから・・・)

id:goodvn

ありがとうございます.

レンタルサーバだと,他のユーザの事情(設定変更など)により,自分が想定しないところで,Apache の再起動が起こります.

この場合,時間のかかる処理を行っていると,プロセスが中断されてしまうのです.

ゾンビ,あるいは孤児プロセス,放っておけば消えます(OSが消してくれる)から,私は続発しても大きな問題ないのではないかと思っています.もちろん,リソースは無駄に使っていますけど,それはうちのサーバなんで,ハードウェアのリソースを増やすので問題ないです.

2008/11/15 15:15:51
id:b-wind No.2

回答回数3344ベストアンサー獲得回数440

ポイント150pt

PHP に限らずですが、Gearman と TheSchwartz という仕組みがありますので、それを利用してはどうでしょうか?

web2.0 時代のジョブキューサーバー Gearman と TheSchwartz の関係について - TokuLog 改めB日記


もともとの形を残したいなら、nohup コマンド経由にするか、

system('cmd_here >/dev/null 2>&1 </dev/null &');

として標準エラーと標準入力も切り離してしまえばよいはずですが試していないので。

id:goodvn

とりあえず,実験していて分かったのですが,system を使うバックグラウンド処理は,mod_php では動かなくて,CGI にする必要がありました.

続いて,

system('cmd_here </dev/null >/dev/null 2>&1 &');

はバックグラウンドは問題なく動きますが,親プロセスである Apache のリスタートを行うと,こちらのプロセスも kill されてしまうようです.

ちょっとやっつけな気もしますが,at コマンドを使って,ジョブを予約してしまう,というアイデアを実験してみようと思います.

2008/11/15 16:40:39

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

  • PHP でバックグラウンド処理 はてなの質問ピックアップ 2008-11-20 17:52:28
    PHP でバックグラウンド処理を行うアイデアです. PHP でバックグラウンド処理を行う基本的なコードとしては, system(\'cmd_here &gt;/dev/null &amp;\'); とすることで,別プロセスでコマンド
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません