2

system()私は呼び出しを使用して他の (潜在的に長時間実行される) プログラムを実行するPHP スクリプトを持っています (目的: NCBI BLAST、phrap、primer3、および DNA シーケンス分析とアセンブリを行うためのその他のプログラム)。

コマンド プロンプトから、またはサービスとして PHP の CLI バージョンを使用して、Windows XP で実行しています。(どちらの場合も、データベース テーブル内のタスクのキューを介して通信します)。

PHP4 の場合: Ctrl+を押すCと、スクリプトが停止し、その時点で実行されているすべての子プロセスも停止します。PHP5 の場合: Ctrl+を押すとC、スクリプトは停止しますが、子プロセスは実行されたままになります。

同様に、スクリプトをサービスとして実行する場合、PHP4 で実行するとサービスを停止すると子が停止しますが、PHP5 では子は引き続き実行されます。

最小限のテスト アプリケーションを作成してみましたが、同じ動作が見つかりました。テスト PHP スクリプトは、system() を使用して C プログラム (30 秒間スリープするだけ) を実行し、キーが押されるのを待ちます。

PHP 4.4.9 と 5.2.6 のソースを見てみましたが、system() コードに違いは見られませんでした。また、CLI アプリケーションのスタートアップ コードもざっと見てみましたが、シグナル処理に違いは見られませんでした。

これを引き起こした原因、または回避策についてのヒントをいただければ幸いです。

ありがとう。

4

2 に答える 2

2

この問題は、少なくとも PHP 5.1.2 で発生します。

CTRL+C または CTRL+BREAK で SIGINT が送信されると、ハンドラーが呼び出されます。このハンドラーが SIGTERM を他の子に送信すると、シグナルは受信されません。

SIGINT は posix_kill() 経由で送信でき、期待どおりに機能します。これは、ハード ブレークによって開始された場合にのみ適用されます。

から: http://php.oregonstate.edu/manual/en/function.pcntl-signal.php

ドキュメントには、CTRL+C をトラップし、posix_kill を子に送信するためのサンプル コードがあります。子プロセスとシグナルに関する他の多くのコードと情報があります。

于 2008-10-03T02:09:09.363 に答える
2

system() を使用する代わりに、proc_open()proc_close()proc_terminate () を見てください。

于 2008-10-13T17:41:27.997 に答える