CLI(cmd、bashなど)を介してプログラムを実行するために使用されるユーティリティ機能があります。STDOUT
、STDERR
およびの 3 つの項目の配列を返しますEXIT CODE
。
これまでのところ、問題なくうまく機能しています。実際、私が抱えている問題は機能を妨げるものではありませんが、パフォーマンスが心配です。
問題は、場合によっては、PHP が同じコマンドを複数回 (私の場合は 3 回) 実行することです。
/**
* 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 boolean $log Whether to log execution failures or not (defaults to true).
* @return array Array of "stdout", "stderr" and "return".
*/
public static function execute($cmd,$stdin=null,$log=true){
//static $once=true; if(!$once)die; $once=false;
$proc=proc_open($cmd, array(
0=>array('pipe','r'),
1=>array('pipe','w'),
2=>array('pipe','w') ), $pipes);
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);
if($return!=0 && $log)
xlog('Error: Program execution returned failure.',$stdout,$stderr,$return);
return array( 'stdout'=>$stdout, 'stderr'=>$stderr, 'return'=>$return );
}
コメント行 (9 行目) に注意してください。それはテスト用でした。これを有効にして、ターゲット プログラムが 1 回だけ実行されるようにしました (コードが何らかの形で同じ関数を呼び出している可能性があると考えていました)。しかし、その行を有効にしても、プログラムは複数回実行されました。
現状では、同じプログラムを (別の機会に) 実行しているコード内の 2 つの場所があります。コマンドラインはどちらも同じです。
ただし、プログラムが 1 回実行される場合と、PHP がプログラムを 3 回実行する場合があります。
Process Explorer でこの動作を監視して確認しています。Windows 7 x64 を使用しています。プログラムは PHP と同様に 32 ビットです。
編集:問題のプログラムはカスタム開発されており、新しいプロセスを開きません。