4

phpからbashコードを呼び出していますが、bashを(で&)フォークしても、完全なbashが完了する前にphpが終了しません。

このコード:

<html>
<body>
HTML START<br>
<pre>
<?php
echo "PHP START\n";
echo `sleep 30 &`;
echo "PHP END\n";
?>
</pre>
HTML END<br>
</body>
</html>

30秒後まで、ブラウザに何も表示されません。

私が本当に望んでいるのは、PHPからGUIアプリを起動することです。これは、引き続き実行されるはずです。

4

5 に答える 5

3

スリープ呼び出しですべてのファイル記述子を閉じて、デタッチできるようにします。

<?php
echo "PHP START\n";
echo `sleep 30 <&- 1<&- 2<&- &`;
echo "PHP END\n";
?>

それ以外の場合、出力ファイル記述子はまだ開いており、プロセスが直接接続されていなくても、PHP は出力の受信を待機しようとしています。

これは実行時に正しく機能し、すぐに終了しますが、スリープ プロセスは残されます。

$ time php5 test.php; ps auxw | grep sleep | grep -v grep
PHP START
PHP END

real    0m0.019s
user    0m0.008s
sys         0m0.004s
cduffy    6239  0.0  0.0  11240   576 pts/0    S    11:23   0:00 sleep 30
于 2012-05-16T16:17:57.803 に答える
1

PHP は、アンパスタンドが明示的に指定されていても、呼び出されたプロセスが終了するのを待ちます

于 2012-05-16T16:11:13.837 に答える
0

別の PHP スクリプトへの Ajax 呼び出しを使用して、別の HTTP プロセスを作成することもできます。このタスクはsleep 30、サーバー上でコマンドまたは必要なものを非同期的に起動することです。

于 2012-05-16T16:13:43.057 に答える
0

おそらくやりたいことは、フォークされたプロセスを分離することです。これを行う 1 つの方法はnohup、bash コマンドで使用することです。

例については、php.net > exec のユーザー コメントを見てください。特にこれは次のとおりです。

ただし、直接的なフィードバックが得られず、プロセスや結果を他の方法で監視する必要があることに注意してください。

于 2012-05-16T16:24:26.407 に答える
-1
sleep(30);

にちがいない...

<?php
echo "PHP START\n";
echo sleep(30);
echo "PHP END\n";
?>
于 2012-05-16T16:18:34.750 に答える