2
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,它会导致调用者死循环,然后超时。为什么会发生这种情况?

4

2 回答 2

1

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

正如 Roman Newaza 所指出的,您应该真正避免使用pcntlFPM 下的函数(以及通常在 CLI 之外)。

于 2012-07-18T04:50:15.460 回答
0

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

于 2012-07-18T02:41:49.300 回答