人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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

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

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

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


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

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

●質問者: goodvn
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:Apache PHP アイデア コマンド コード
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● kn1967
●150ポイント

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

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

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


不正手段としては・・・

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

出来るというのであれば

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

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

◎質問者からの返答

ありがとうございます.

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

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

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


2 ● b-wind
●150ポイント

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 コマンドを使って,ジョブを予約してしまう,というアイデアを実験してみようと思います.

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ