2012-07-18 39 views
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,它会导致调用者死循环,然后超时。 为什么会发生这种情况?两次调用pcntl_fork导致PHP CGI死循环

回答

1

过程控制不应该在Web服务器环境中启用,如果任何过程控制功能的web服务器环境中使用可能会发生意想不到的结果:PCNTL/Introduction

1

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

正如Roman Newaza所指出的那样,您应该真正避免FPM下的功能(以及通常在CLI之外)。

+0

好的。这似乎几乎是完全的原因,除了我认为pcntl_waitpid应该阻止而不是死循环。 – tewilove 2012-07-18 12:40:19

相关问题