代码之家  ›  专栏  ›  技术社区  ›  asp

使用PHP监视子分叉

  •  9
  • asp  · 技术社区  · 17 年前

    我有个问题,我使用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中作为子脚本执行的PHP脚本的状态。是否有任何方法可以知道子脚本是否仍在运行,或者在执行子脚本期间是否出现致命错误,并使用捕获从子进程到父进程的所有消息;

    pcntl_signal(SIGUSR1, "signal_handler");
    

    谢谢和问候,
    阿伦·山克·普拉萨。

    1 回复  |  直到 17 年前
        1
  •  17
  •   hobodave    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_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()等方法在进程之间进行通信。

    我相信其中之一将提供您正在寻找的解决方案。但是,深入研究如何使用这些方法中的任何一种的细节可能都超出了这个问题的范围,但是如果您需要任何选择使用的方法的帮助,请随意问一个新问题。

    推荐文章