问题标签 [proc-open]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1162 浏览

php - 在处理冗长的脚本时 php-capture 控制台输出

我在将 ssh 脚本输出捕获到浏览器上时遇到问题,因为它执行而不是最终得到它。

编写的脚本:

Shell 脚本需要 10 分钟才能执行。如果 $counter=10 则需要花费太多时间才能将实际输出显示在屏幕上。我要求它在执行时继续显示流输出,以便我们知道发生了什么。有缓冲的情况吗?

0 投票
3 回答
5890 浏览

php - PHP 进程执行超时

我有以下代码:

它有两个“问题”。

  • 代码是同步的;它冻结,直到目标进程关闭。
  • $cmd > /dev/null &到目前为止,如果不发出不同类型的命令(例如在 linux 和start /B $cmdwindows 上),我就无法从“冻结”中解脱出来

我根本不介意“冻结”。我只需要实现那个超时。

注意:解决方案跨平台兼容很重要。$cmd不必更改也很重要- 我正在运行一些复杂的命令,我担心可能会有一些问题,但是,这取决于修复的类型 - 我很高兴听到这些,只是我更喜欢不同的选择。

我找到了一些可能有帮助的资源:

0 投票
4 回答
9801 浏览

php - 在 PHP 中正确执行 shell

问题

我正在使用一个proc_open()用于调用 shell 命令的函数。看来我做 STDIO 的方式是错误的,有时会导致 PHP 或目标命令锁定。这是原始代码:

大部分时间都有效,但这还不够,我想让它一直有效。

如果 STDIO 缓冲区超过 4k 的数据,问题就在于stream_get_contents()锁定。

测试用例

我们两次向 STDERR 和 STDOUT 输出一个字符串,总长度为 4120 字节(超过 4k)。这会导致 PHP 在两边都锁定。

解决方案

显然,stream_select()是要走的路。我有以下代码:

剩下的唯一一块拼图是处理 STDIN(见标有 的行(???))。 我发现 STDIN 必须由调用我的函数的任何东西提供,execute(). 但是如果我根本不想使用 STDIN 怎么办?在上面的测试用例中,我没有要求输入,但我应该对 STDIN 做点什么。

也就是说,上述方法仍然冻结stream_get_contents(). 我很不确定下一步该做什么/尝试。

学分

Jakob Truelsen 提出了解决方案,并发现了原始问题。4k 小费也是他的主意。在此之前,我对为什么该函数工作正常感到困惑(不知道这完全取决于缓冲区大小)。

0 投票
2 回答
26562 浏览

php - 如何获得 proc_open() 的输出

我试图从proc_openphp 中的方法获取输出,但是,当我打印它时,我得到了空。

只要我知道,我就可以得到输出stream_get_contents()

但我不能这样做..有什么建议吗?

谢谢之前...

0 投票
1 回答
2670 浏览

php - PHP proc_open 不起作用 - 给我“数组中缺少句柄限定符”

警告:proc_open():第 102 行 C:\...\updatedots.php 中的数组中缺少句柄限定符

我正在尝试打开记事本并在 2 秒后关闭它。这是我的代码:

知道这个错误是什么意思,是什么原因造成的?

0 投票
2 回答
2539 浏览

php - PHP 显示 CMD 命令提示符窗口 (Windows)

通常,您会想要隐藏 CMD 窗口。就我而言,我将使用 PHP+CLI 进行一些测试。如果可以使 PHP 启动 CLI 弹出窗口,那将非常有用。但是,唉,我找不到办法做到这一点。

以下命令应该使它工作,但它没有:

有问题的 PHP 代码基于proc_open()

虽然命令运行良好,但弹出窗口没有出现。我怀疑这是 Apache 的一个特性。有没有办法将 CMD 与其父级完全分离?

另外,我将替换DIR为初始化环境的小脚本/批处理/程序,因此在弹出窗口出现后我可以执行程序很重要。

(这主要用于教育目的,不会用于生产。)

0 投票
0 回答
862 浏览

java - PHP 和管道中的 Proc_Open

这是一个源代码,用于通过带有 MySQL 服务器的 Web 界面控制 minecraft 服务器。一切正常,除了第 29 行,它似乎没有被执行。服务器 cin 中根本没有出现任何内容。也没有发生任何事情......有人知道为什么会这样吗?

0 投票
0 回答
460 浏览

php - 如何在 Linux 上将 proc_open() 与非标准文件描述符一起使用?

proc_open()文档指出,可以使用标准文件描述符以外的其他文件描述符:

文件描述符编号不限于 0、1 和 2 - 您可以指定任何有效的文件描述符编号,并将其传递给子进程。

但是你实际上是怎么做的呢?

您需要在父进程和子进程上做什么,例如使用带有 proc_open 调用的额外输入和输出管道?

编辑:

一个相关问题 - 如果启动的进程也是 PHP 函数,您可以使用流包装器访问 PHP 中的任意 fd php://fd/3(将 3 替换为 fd 编号),但此功能仅在 PHP 5.3.6+ 中可用。有没有办法在 PHP 5.2 中访问任意 fd?

0 投票
1 回答
4028 浏览

php - 使用 PHP 的 proc_open + bypass_shell 在后台运行可执行文件并检索正确的 PID?

那么,在 Windows 上的 PHP 中:是否可以在后台运行可执行文件并检索其 PID?我推断可以分别完成这两项任务,但不能一起完成。

后台处理过程

要使通过 SHELL 启动的进程后台运行,'start /B "bg" myprog.exe'必须使用该命令并且之后必须立即关闭 SHELL 进程。

为此,很多人都这样使用pclose( popen( ... ) ),但据我所知,使用 popen 时pclose( popen( 'start /B "bg" myprog.exe', 'r') );无法检索到。pid

因为用 popen 是不可能得到的pid,所以我们必须查看 proc_open。

获取 PID

当且仅当设置为 true时,我们可以检索exeproc_open的 pid 。 bypass_shell

如果bypass_shell设置为 false(默认值),Windows 将返回pidSHELL。欲了解更多信息,请参阅:https ://bugs.php.net/bug.php?id=41052

问题解释

start /B命令在传递给 proc_open 时失败,bypass_shell = true因为它跳过了 SHELL 并将命令行参数直接发送到不知道如何处理它们的 myprog.exe。

相反,如果bypass_shell = false(默认)和 proc_close 用于立即关闭 SHELL,myprog.exe 就像使用时一样在后台运行,pclose( popen( ... ) )但返回不正确 pid(我们得到pid了 SHELL)。

那么,后台+正确的pid检索可能吗?

如果不是,那么下一个最好的事情是什么?我需要为将部署在共享主机上的 PHP 脚本执行此操作,因此无法安装第三方扩展。我能想到的最好的tasklist办法是在后台启动 myprog.exe 之前和之后拍摄快照,然后交叉分析结果。请注意,myprog.exe 可以同时运行。

如果它有帮助,虽然它不应该有所作为,myprog.exe 实际上是 ffmpeg(它安装在大多数共享的 webhosts 上)。

临时解决方案

0 投票
1 回答
854 浏览

php - PHP - proc_open - 环境转发如何工作?

proc_open 函数的 PHP 文档指出,在生成子进程时,您可以将 null 作为 'env' 参数的值传递,以将父脚本的环境转发到子进程。这里有没有人这样做过,如果有,你介意详细说明一下吗?

如果用户在父进程中有会话数据,是否会传递给子进程?如果父进程包含各种库、类等……,这些是否也传递给子进程?

谢谢你。