- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个实用函数,用于通过 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 行)。那是为了测试。我启用它以确保目标程序只运行一次(我在想我的代码可能以某种方式调用了相同的函数)。但即使启用了该行,该程序仍会运行多次。
事实上,我的代码中有 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/
这是我的代码 $descriptorspec = array( 0 => array("pipe", "r") ); $call_mp4 = "ffmpeg command ...... "; $op
我正在尝试将lighttpd编译为处理器arm的静态,以便可以在Android设备上运行。我正在用交叉编译器arm-musl-linuxeabi编译lighttpd,我在https://bitbuck
这是我想要实现的目标:打开一个 shell(korn 或 bash,没关系),从那个 shell,我想打开一个 ssh 连接(ssh user@host)。在某些时候,可能会提示我输入密码,或者可能会
我正在尝试使用 proc_open() 运行进程功能。正如页面上所指定的 - 我提供了自定义环境变量并尝试打印出来。它显示了我提供的所有变量+始终为 3 个变量:“SLVL”、“PWD”、“_=”。我
我想调用proc_open在后台执行一个脚本,后台进程会在几秒后终止。基本上,该脚本是一个 C/Java/Python 脚本,它将编译并运行用户提交的代码,因此我希望该进程能够在一段时间后终止。 我想
我有一个实用函数,用于通过 CLI(cmd、bash 等)执行程序。它返回一个包含 3 个项目的数组:STDOUT、STDERR 和 EXIT CODE。 到目前为止,它运行良好,没有出现问题。事实上
我正在编写可在 *nix 系统下运行的 php 代码。我需要在 php 代码中调用带有 5 个参数的 python 脚本。一些争论是用户输入,所以可能有任何字符。我不知道如何将参数传递给脚本。我将如何
以下脚本监视 /dev/shm/test 是否有新文件并实时输出有关它的信息。 问题是当用户关闭浏览器时,inotifywait 进程仍然打开,等等。 有什么办法可以避免这种情况吗? array("
我目前正在开发一个在线程序。我正在编写一个 php 脚本,它在命令行中使用 proc_open() (在 Linux Ubuntu 下)执行命令。到目前为止,这是我的代码: array("pipe"
我正在使用带有 pdftk 的 proc_open 来用数据预填充一些表格,这工作得很好,但我不想将结果保存到文件然后读回文件,而是直接打印文件.我有这个工作,所以我没有任何问题。但我想将 proc_
我有一个 PHP 脚本,我想从 PHP 脚本调用一个用 C 编写的进程。有很多方法可以做到这一点(系统,执行...),但是选择函数proc_open。有了这个,我可以使用 C 进程在 stdin 和
我正在尝试使用 proc_open(需要双向支持)调用 C++/Python 文件。 在做了一些在线研究后,我发现创建了这段代码:(我首先用 c++ 尝试,失败后我也尝试了 python) PHP:
我正在运行一个sh 脚本,它通过ubuntu服务器上的php运行java进程。我正在使用 proc_open 来运行该进程。通常工作流程如下: 请求页面 -> 脚本运行(直到完成)-> 结果页面。 在
我在 php 中使用 proc_open 来启动一个子进程并来回发送数据。 有时我想等待进程结束并检索退出代码。 问题是如果进程已经完成,我对proc_close 的调用返回-1。对于 proc_cl
我有 2 个 PHP 脚本,分别是 caller.php 和 task.php。 caller.php 使用 JQuery Ajax 请求调用,然后 caller.php 启动一个进程在后台运行 PH
我有一个 PHP 脚本,我在其中使用 proc_open() 创建了一个新进程。它执行了大约 2 小时,最后我有一个 proc_close()。 有时我需要在中间停止这个进程,我如何杀死/发出信号以停
当尝试使用 ffmpeg 将 wmv 文件(转换为 flv)转换为 flv 时,我在 Windows 上遇到了 proc_open 问题,但我怀疑我会遇到每当某些情况发生时,都会发生相同的情况。 基本
所以我用 $process = proc_open("my_process", $descriptors, $pipes); 打开一个进程 然后我使用 fwrite($pipes[0], "some_
在 PHP 中有一个方便的函数叫做 proc_open .它可用于调用可执行文件,将其 stdin、stdout 和 stderr 作为管道打开。 这个函数在 C++ 中有一个很好的跨平台版本吗?唯一
考虑这个示例脚本: STDIN, 1 => STDOUT, 2 => STDERR), $pipes); fgetc(STDIN); 当 /bin/sh 符号链接(symbolic link)到 /
我是一名优秀的程序员,十分优秀!