web-dev-qa-db-ja.com

Apacheは、PHPで生成した子プロセスをいつ/どのように強制終了しますか?

これがサーバー障害またはスタックオーバーフローに適しているかどうかはわかりませんが、ここで説明します。

私はApacheMPMプリフォークでmod_phpを使用しており、次のような新しいプロセスを生成しています。

<?php
exec("/usr/bin/php -f backgroundScript.php &");
?>

新しいbackgroundScript.php子プロセスが長時間実行されると仮定すると…

1)親PHPプロセスはアイドル状態と見なされますか?サーバープールに戻りますか?

2)Apacheが親PHPプロセスを強制終了してMinSpareServersに戻る場合、backgroundScript.phpもクリーンアップされるか、無期限に実行を継続しますか?

3)ApacheがbackgroundScript.php子プロセスを誤って強制終了する可能性がある他の方法はありますか? service httpd stop多分?

2
geofflee

アプリケーションをバックグラウンドで実行して忘れたいですか?

php.netにはこれに関する多くの投稿があります

また、幹部からのメモ:

注意:

プログラムがこの関数で開始された場合、プログラムがバックグラウンドで実行され続けるためには、プログラムの出力をファイルまたは別の出力ストリームにリダイレクトする必要があります。そうしないと、プログラムの実行が終了するまでPHPがハングします。

同じ ここここここ など

私はこれらの規則に違反して、醜いコードを持っています:

<?php
echo "pre";
exec("someuglylongandworkingthingwithoutput &");
echo "post";
?>

デフォルトのApache + php(prefork +モジュール)を使用してFedoraボックスでテストしたところ、killall -9/usr/sbin/httpdでプロセスを強制終了しました。

  1. &-いいえ、そうではありませんでしたが、それでも実行中と見なされます。私のバックグラウンドアプリはまだ実行中です
  2. 上記の私のテストによると-それは続くでしょう
  3. p 1によると同じように、initスクリプトがApacheを終了する方法によって異なります。

/dev/nullを追加した後-すべてが正常で、親プロセスIDは「1」です。

4
GioMac