我有一个实用程序函数用于通过CLI(cmd,bash等)执行程序.它返回一个包含3个项目的数组:STDOUT,STDERR和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行).那是为了测试.我启用它以确保目标程序只运行一次(我以为我的代码可能会以某种方式调用相同的函数).
但即使启用该行,程序仍会运行多次.
实际上,我在我的代码中有两个位置,我正在执行相同的程序(在不同的场合).两个命令行都是相同的.
但是,有一次,程序运行一次,而在这种情况下,PHP运行程序3次.
我一直在Process Explorer下监视和看到这种行为.我使用的是Windows 7 x64.该程序是32位,PHP也是如此.
编辑:有问题的程序是自定义开发的,它不会打开新进程.