次のコードがあります。
/**
* Executes a program and waits for it to finish, taking pipes into account.
* @param string $cmd Command line to execute, including any arguments.
* @param string $input Data for standard input.
* @param integer $timeout How much to wait from program in msecs (-1 to wait indefinitely).
* @return array Array of "stdout", "stderr" and "return".
*/
function execute($cmd,$stdin=null,$timeout=-1){
$proc=proc_open(
$cmd,
array(array('pipe','r'),array('pipe','w'),array('pipe','w')),
$pipes=null
);
fwrite($pipes[0],$stdin); fclose($pipes[0]);
$stdout=stream_get_contents($pipes[1]); fclose($pipes[1]);
$stderr=stream_get_contents($pipes[2]); fclose($pipes[2]);
$return=proc_close($proc);
return array(
'stdout' => $stdout,
'stderr' => $stderr,
'return' => $return
);
}
それには2つの「問題」があります。
- コードは同期的です。ターゲットプロセスが閉じるまでフリーズします。
- これまでのところ、別の種類のコマンド (
$cmd > /dev/null &
Linux やstart /B $cmd
Windows など)を発行せずに「フリーズ」することはできませんでした。
「フリーズ」は全く気にならない。そのタイムアウトを実装するだけです。
注:ソリューションがクロスプラットフォーム互換であることが重要です。を変更する必要がないことも重要$cmd
です - 私はいくつかの複雑なコマンドを実行していて、いくつかの問題があるのではないかと心配していますが、これは修正の種類によって異なります - これらを聞いてうれしいです別の選択肢を好むというだけです。
役立つリソースをいくつか見つけました。