当前位置:  开发笔记 > 编程语言 > 正文

使用PHP监视儿童分叉

如何解决《使用PHP监视儿童分叉》经验,为你挑选了1个好方法。

我有一个问题,我使用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.



1> hobodave..:

你绝对可以监控子进程:

$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()等方法跨进程进行通信.

我相信其中一个将提供您正在寻找的解决方案.详细介绍如何使用这些方法,可能超出了这个问题的范围,但如果您需要帮助选择使用哪种方法,请随时提出新问题.

推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有