0

この UNIX コマンドをシェルで直接実行すると、次のようになります。

$ sleep 100 &

sleep は期待どおりバックグラウンドで実行され、コマンド ラインで作業を続けることができます。

しかし、shell_exec() と php で同じことをしようとすると、異なる結果が得られます。

<?php

  $sleep = $argv[1];
  $shell="sleep " . $sleep . " &";
  shell_exec($shell);

?>

コマンドラインを実行するphp sleep.php 100とハングし、スリープが終了するまでそれ以上コマンドを受け入れません。shell_exec()これが/$argvの php または unix シェルで欠けているニュアンスであるかどうかはわかりません。

ありがとう。

4

1 に答える 1

3

関数はコマンドのshell_exec出力を取得しようとしていますが、処理を続行しながら実行することはできません。実際、php のソース コードを見ると、phpshell_exec関数はpopenC 呼び出しを実行しwait、コマンドで syscall を実行します。wait子プロセスが終了するまでサブプロセスが戻らないことを保証します。

于 2013-10-02T19:15:33.777 に答える