子プロセスを確実に監視できます。
$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つがあなたが探している解決策を提供すると確信しています。これらの方法の使用方法の詳細に入るのは、おそらくこの質問の範囲を超えていますが、どちらの方法を使用する場合でも、助けが必要な場合は、新しい質問をしてください。