PHP proc_open打开多次

我有一个实用程序function,用于通过CLI(CMD,bash等)执行程序。 它返回3个项目的数组: STDOUTSTDERREXIT CODE

到目前为止,它一直很好地工作,没有问题。 事实上,我所遇到的问题并不妨碍它的function,但我担心的是性能。

问题是,在某些情况下,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行)。 那是为了testing。 我启用它来确保目标程序只运行一次(我想我的代码可能调用相同的function)。 但即使启用了该行,该程序仍然运行多次。

事实上,我在我的代码中有两个地方执行相同的程序(在不同的场合)。 这两个命令行是相同的。

但有一次,程序运行一次,而在这个场合,PHP运行程序三次。

我一直在Process Explorer下监视和看到这个行为。 我正在使用Windows 7 x64。 该程序是32位的,就像PHP一样。

编辑:有问题的程序是自定义开发的,它不会打开新的进程。

你的代码来测试它只运行一次看起来有缺陷。

如果你有2个PHP进程运行,他们将不会共享一个静态变量。 所以有可能你有同时发生的请求,导致这个运行不止一次。

其次,你应该在函数结束时将$once设置$once false,否则将永远不能达到die

尝试添加一些日志记录,看看函数是否被调用两次。

创建一些只运行外部应用程序的单元/压力测试。 如果你看到多个进程,那么你的应用程序有一些错误的东西,而不是PHP代码。

这很奇怪。 没有完整的代码就很难弄清楚。

如果你强调你的服务器多次调用相同的页面,我最好的选择可能与CPU循环过程有关。 PHP没有时间将静态变量设置为false,因为在这个方法中还有另一个请求。 其他的可能性是,PHP没有正确隔离静态值,并且不同的请求可以读取不同的内存位置,直到PHP将这些值同步。

我知道这可能不是最好的选择,但这是我做的。 虽然这是在Linux上,但是我确定有办法把它移植到Windows上。

我所做的,是运行pgrep,并检查是否已经存在这样的命令,如果它只是退出。 正如你所说,你正在运行相同的命令(具有确切的参数),所以只是检查是否已经有一个命令运行和行为分别。

我用这个命令:

 $pid = shell_exec('pgrep -cfx "/* My command */"'); if ($pid > 1) return -1;