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

FPMで呼び出しexit()ても親プロセスは終了しないため、機能しません。リクエストをクリーンアップしてから、利用可能なワーカー プロセスのプールに戻るだけです。実際には終了しないため、 はpcntl_waitpid永遠に待機することになります。

Roman Newaza が指摘しているように、pcntlFPM の下 (および一般的には CLI の外) で機能を使用することは本当に避けるべきです。

于 2012-07-18T04:50:15.460 に答える
0

Process Control should not be enabled within a web server environment and unexpected results may happen if any Process Control functions are used within a web server environment: PCNTL/Introduction

于 2012-07-18T02:41:49.300 に答える