gpt4 book ai didi

PHP proc_open 多次打开

转载 作者:可可西里 更新时间:2023-11-01 12:53:59 30 4
gpt4 key购买 nike

我有一个实用函数,用于通过 CLI(cmd、bash 等)执行程序。它返回一个包含 3 个项目的数组:STDOUTSTDERREXIT 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 行)。那是为了测试。我启用它以确保目标程序只运行一次(我在想我的代码可能以某种方式调用了相同的函数)。但即使启用了该行,该程序仍会运行多次。

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

但是,有一次,程序运行了一次,而在这种情况下,PHP 运行了程序 3 次。

我一直在 Process Explorer 下监控并看到这种行为。我正在使用 Windows 7 x64。该程序是 32 位的,PHP 也是。

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

最佳答案

您用于测试它仅运行一次的代码看起来有缺陷。

如果你有 2 个 php 进程在运行,它们将不会共享一个静态变量。因此,您可能有同时请求导致它运行不止一次。

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

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

创建一些仅运行外部应用程序的单元/压力测试。如果您看到多个进程,那么您的应用有问题,而不是 php 代码。

关于PHP proc_open 多次打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4776348/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com