问题标签 [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.
php - 在处理冗长的脚本时 php-capture 控制台输出
我在将 ssh 脚本输出捕获到浏览器上时遇到问题,因为它执行而不是最终得到它。
编写的脚本:
Shell 脚本需要 10 分钟才能执行。如果 $counter=10 则需要花费太多时间才能将实际输出显示在屏幕上。我要求它在执行时继续显示流输出,以便我们知道发生了什么。有缓冲的情况吗?
php - PHP 进程执行超时
我有以下代码:
它有两个“问题”。
- 代码是同步的;它冻结,直到目标进程关闭。
$cmd > /dev/null &
到目前为止,如果不发出不同类型的命令(例如在 linux 和start /B $cmd
windows 上),我就无法从“冻结”中解脱出来
我根本不介意“冻结”。我只需要实现那个超时。
注意:解决方案跨平台兼容很重要。$cmd
不必更改也很重要- 我正在运行一些复杂的命令,我担心可能会有一些问题,但是,这取决于修复的类型 - 我很高兴听到这些,只是我更喜欢不同的选择。
我找到了一些可能有帮助的资源:
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 小费也是他的主意。在此之前,我对为什么该函数工作正常感到困惑(不知道这完全取决于缓冲区大小)。
php - 如何获得 proc_open() 的输出
我试图从proc_open
php 中的方法获取输出,但是,当我打印它时,我得到了空。
只要我知道,我就可以得到输出stream_get_contents()
但我不能这样做..有什么建议吗?
谢谢之前...
php - PHP proc_open 不起作用 - 给我“数组中缺少句柄限定符”
警告:proc_open():第 102 行 C:\...\updatedots.php 中的数组中缺少句柄限定符
我正在尝试打开记事本并在 2 秒后关闭它。这是我的代码:
知道这个错误是什么意思,是什么原因造成的?
php - PHP 显示 CMD 命令提示符窗口 (Windows)
通常,您会想要隐藏 CMD 窗口。就我而言,我将使用 PHP+CLI 进行一些测试。如果可以使 PHP 启动 CLI 弹出窗口,那将非常有用。但是,唉,我找不到办法做到这一点。
以下命令应该使它工作,但它没有:
有问题的 PHP 代码基于proc_open()
:
虽然命令运行良好,但弹出窗口没有出现。我怀疑这是 Apache 的一个特性。有没有办法将 CMD 与其父级完全分离?
另外,我将替换DIR
为初始化环境的小脚本/批处理/程序,因此在弹出窗口出现后我可以执行程序很重要。
(这主要用于教育目的,不会用于生产。)
java - PHP 和管道中的 Proc_Open
这是一个源代码,用于通过带有 MySQL 服务器的 Web 界面控制 minecraft 服务器。一切正常,除了第 29 行,它似乎没有被执行。服务器 cin 中根本没有出现任何内容。也没有发生任何事情......有人知道为什么会这样吗?
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?
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 将返回pid
SHELL。欲了解更多信息,请参阅: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 上)。
临时解决方案
php - PHP - proc_open - 环境转发如何工作?
proc_open 函数的 PHP 文档指出,在生成子进程时,您可以将 null 作为 'env' 参数的值传递,以将父脚本的环境转发到子进程。这里有没有人这样做过,如果有,你介意详细说明一下吗?
如果用户在父进程中有会话数据,是否会传递给子进程?如果父进程包含各种库、类等……,这些是否也传递给子进程?
谢谢你。