我有问题,我使用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...";
}
我试图找出一种方法来监视在父fork中作为Child执行的PHP脚本的状态。是否有任何方法可以知道子进程是否仍在运行,或者在执行子脚本期间是否有任何致命错误,并使用以下内容捕获从子进程到父进程的所有消息;
pcntl_signal(SIGUSR1, "signal_handler");
谢谢&问候,
Arun Shanker Prasad。
答案 0 :(得分: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库,您也仅限于处理信号和退出代码。
不知道你究竟做了什么。您有其他各种选择。我建议使用以下异步消息传递解决方案之一,因为它们可能满足您的需求。
基于文件
您的子进程可以将消息写入文件,该文件将由父级进行轮询。
基于Memcache
与上述相同,但使用memcached作为通讯媒介。
基于数据库
与上述相同,但使用db表作为通信媒介。
PHP的信号量/ IPC库
http://us3.php.net/manual/en/book.sem.php
这允许您使用msg_send()和msg_receive()等方法跨进程进行通信。
我相信其中一个将提供您正在寻找的解决方案。详细介绍如何使用这些方法,可能超出了这个问题的范围,但如果您需要帮助选择使用哪种方法,请随时提出新问题。