3

shell_exec()PHP 組み込み Web サーバーは、バックグラウンド プロセスを適切に処理していないようです。でバックグラウンドに明示的に配置されていても、バックグラウンド プロセスが完了するまでリクエストはハングし&ます。

例:

$ ls
runit.php
$ cat runit.php 
<?php
echo "Here we are\n";
shell_exec("sleep 5 &");
echo "and the command is done\n";
?>
$ php -S localhost:7891
PHP 5.5.9-1ubuntu4.9 Development Server started at Mon May 18 19:20:12 2015
Listening on http://localhost:7891
Press Ctrl-C to quit.

次に、別のシェルで:

$ GET http://localhost:7891/runit.php
(...waits five seconds...)
Here we are
and the command is done

これは起こるべきではありませんし、実稼働グレードの Web サーバーを使用している場合は実際には起こりません。それを回避する方法はありますか?

(注: これはフラッシュの問題ではありません。flush()最初のエコーの後に追加しても発生せず、バックグラウンド プロセスが完了するまでリクエストはハングします。)

4

2 に答える 2

1

これはPHP によってバグとして認識されていますが、組み込みの webserver では修正されません。ただし、バグ レポートでは回避策も提案されています。応答に正しい値Content-Lengthを設定すると、受信側のブラウザーは、大量のデータを受信した後にクライアント側で要求を閉じ、問題を回避します。

于 2015-05-18T19:40:50.473 に答える
-1

オプションは次のとおりです。

1) 別のスレッドを使用してプロセスを実行する

<?php 
for ($i = 1; $i <= 5; ++$i) { 
        $pid = pcntl_fork(); 

        if (!$pid) { 
            sleep(1); 
            print "In child $i\n"; 
            exit($i); 
        } 
    } 

    while (pcntl_waitpid(0, $status) != -1) { 
        $status = pcntl_wexitstatus($status); 
        echo "Child $status completed\n"; 
    } 
?>

'> /dev/null 2>/dev/null &'2)シェル exec の最後に追加できます 。これにより、すべての出力も削除されますが、コマンドは実行されます。のように見せる

shell_exec('sleep 5 > /dev/null 2>/dev/null &');

于 2015-05-18T18:27:20.653 に答える