你绝对可以监控子进程:
$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 库您也仅限于处理信号和退出代码。
不知道你到底在做什么。您有多种其他选择。我建议使用以下异步消息传递解决方案之一,因为它们可能满足您的需求。
基于文件
您的子进程可以将消息写入文件,该文件将由父进程轮询。
基于内存缓存
与上面相同,但使用 memcached 作为通信介质。
基于数据库
与上面相同,但使用 db 表作为通信媒介。
PHP的信号量/IPC库
http://us3.php.net/manual/en/book.sem.php
这允许您使用 msg_send() 和 msg_receive() 等方法跨进程进行通信。
我相信其中之一将提供您正在寻找的解决方案。不过,深入了解如何使用这些方法的细节可能超出了这个问题的范围,但是如果您需要帮助您选择使用哪种方法,请随时提出新问题。