2012-07-18 71 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

相關問題