9

問題があります。pcntl_forkを使用してPHPでプロセスをフォークします。

$pid = pcntl_fork();
if ($pid == -1) {
 die('could not fork');
} else if ($pid) {
 // we are the parent
 pcntl_wait($status); //Protect against Zombie children
} else {
 pcntl_exec("/path/to/php/script");
 echo "Could not Execute...";
}

親フォークで子として実行されたPHPスクリプトのステータスを監視する方法を見つけようとしています。子がまだ実行されているかどうか、または子スクリプトの実行中に致命的なエラーが発生したかどうかを確認し、を使用して子から親プロセスへのすべてのメッセージをキャッチする方法はありますか?

pcntl_signal(SIGUSR1, "signal_handler");

ありがとう&よろしく、
アルンシャンカープラサド。

4

1 に答える 1

17

子プロセスを確実に監視できます。

$pid = pcntl_fork();
if ($pid == -1) {
 die('could not fork');
} else if ($pid) {
 // we are the parent
 pcntl_waitpid($pid, $status, WUNTRACED); //Protect against Zombie children
 if (pcntl_wifexited($status)) {
   echo "Child exited normally";
 } else if (pcntl_wifstopped($status)) {
   echo "Signal: ", pcntl_wstopsig($status), " caused this child to stop.";
 } else if (pcntl_wifsignaled($status)) {
   echo "Signal: ",pcntl_wtermsig($status)," caused this child to exit with return code: ", pcntl_wexitstatus($status);
 }
} else {
 pcntl_exec("/path/to/php/script");
 echo "Could not Execute...";
}
  • pcntl_wifexited()-ステータスコードが正常な終了を表すかどうかを確認します
  • pcntl_wifstopped()-子プロセスが現在停止しているかどうかを確認します
  • pcntl_wifsignaled()-ステータスコードがシグナルによる終了を表しているかどうかを確認します
  • pcntl_wexitstatus()-終了した子の戻りコードを返します
  • pcntl_wtermsig()-子を終了させたシグナルを返します
  • pcntl_wstopsig()-子を停止させたシグナルを返します

編集:

親と子のプロセス間のメッセージングに関して明確にするため。プロセス間で例外を確実にキャッチすることはできません。メッセージングに関しては、PCNTLライブラリのみを使用すると、処理信号と終了コードにも制限されます。

正確には、あなたが何をしているのかわからない。他にもさまざまなオプションがあります。次の非同期メッセージングソリューションのいずれかをお勧めします。それらはおそらくあなたのニーズをカバーする可能性があるからです。

ファイルベース

子プロセスがファイルにメッセージを書き込む可能性があり、そのファイルは親によってポーリングされます。

Memcacheベース

上記と同じですが、通信メディアとしてmemcachedを使用します。

データベースベース

上記と同じですが、通信媒体としてdbテーブルを使用します。

PHPのセマフォ/IPCライブラリ

http://us3.php.net/manual/en/book.sem.php

これにより、msg_send()やmsg_receive()などのメソッドを使用してプロセス間で通信できます。

私はこれらの1つがあなたが探している解決策を提供すると確信しています。これらの方法の使用方法の詳細に入るのは、おそらくこの質問の範囲を超えていますが、どちらの方法を使用する場合でも、助けが必要な場合は、新しい質問をしてください。

于 2009-07-21T16:50:29.107 に答える