调用pcntl_fork两次导致PHP CGI死循环

时间:2012-07-18 02:36:39

标签: fork php

function spawn($exec, $args = array()) {
$pid = pcntl_fork();
if ($pid < 0)
    return false;
else if ($pid == 0) {
    $ppid = getmypid();
    $pid = pcntl_fork();
    if ($pid < 0)
        file_put_contents('/tmp/error.log', "fork failed: ${cmd} ". implode(' ', $args). "\n");
    else if ($pid == 0) {
        pcntl_waitpid($ppid, $status);
        pcntl_exec($exec, $args);
    }
    else
        exit(0);
    }
}

这在CLI模式下运行良好。 但对于php-fpm,它会导致调用者死循环,然后超时。 为什么会这样?

2 个答案:

答案 0 :(得分:1)

不应在Web服务器环境中启用过程控制,并且如果在Web服务器环境中使用任何过程控制功能,则可能会出现意外结果:PCNTL/Introduction

答案 1 :(得分:1)

它不起作用,因为在FPM下调用exit()并不会导致父进程退出 - 它只是让它清理请求,然后返回到可用的工作进程池。由于它永远不会退出,pcntl_waitpid最终会等待。

正如Roman Newaza指出的那样,你应该真正避免使用FPM下的pcntl函数(通常,在CLI之外)。