このunixコマンドをシェルで直接実行すると:
$ sleep 100 &
スリープは予想どおりバックグラウンドで実行され、コマンドラインで作業を続けることができます。
しかし、shell_exec()とphpで同じことをしようとすると、異なる結果が得られます。
<?php
$sleep = $argv[1];
$shell="sleep " . $sleep . " &";
shell_exec($shell);
?>
実行時 php sleep.php 100
コマンドラインがハングし、スリープが終了するまでこれ以上コマンドを受け付けません。これが私が欠けているニュアンスであるかどうかはわかりません shell_exec()
/ $argv
PHPのまたはUNIXシェルで。
ありがとう。
回答:
回答№1の場合は3ザ shell_exec
関数はコマンドの出力をキャプチャしようとしていますが、同時に処理を続けながら実行することはできません。実際、phpソースコードを見ると、 shell_exec
機能は popen
C呼び出し、これは wait
コマンドのsyscall。 wait
子が終了するまでサブプロセスが戻らないことを保証します。