您一定可以监视子进程:
$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_wifstop()-检查子进程当前是否已停止
-
pcntl_wifsignaled()-检查状态代码是否表示由于信号而终止
-
pcntl_wexitstatus()-返回已终止子级的返回代码
-
pcntl_wtermsig()-返回导致子级终止的信号
-
pcntl_wstopsig()-返回导致子进程停止的信号
编辑:
为了澄清父进程和子进程之间的消息传递,您绝对不能捕获跨进程的异常。至于消息传递,仅使用PCNTL库,您还只能处理信号和退出代码。
不知道你在做什么。你还有很多其他的选择。我建议使用以下异步消息传递解决方案之一,因为它们可能满足您的需求。
基于文件
您的子进程可以将消息写入一个文件,该文件将被父进程轮询。
基于MyC缓存的
同上,但使用memcached作为通信媒介。
基于数据库
同上,但使用一个数据库表作为通信媒介。
php的信号量/ipc库
http://us3.php.net/manual/en/book.sem.php
这允许您使用msg_send()和msg_receive()等方法在进程之间进行通信。
我相信其中之一将提供您正在寻找的解决方案。但是,深入研究如何使用这些方法中的任何一种的细节可能都超出了这个问题的范围,但是如果您需要任何选择使用的方法的帮助,请随意问一个新问题。