问题标签 [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 - 使 Proc_Open 同步工作
我有一个依赖于 shell_exec() 的 PHP 脚本,并且(因此)99% 的时间都在工作。该脚本执行了一个生成图像文件的 PhantomJS 脚本。然后使用更多的 PHP 以某种方式处理该图像文件。问题是有时 shell_exec() 会挂起并导致可用性问题。阅读此https://github.com/ariya/phantomjs/issues/11463我了解到 shell_exec() 是问题所在,切换到 proc_open 将解决挂起问题。
问题是,当 shell_exec() 等待执行的命令完成时,proc_open 没有,因此跟随它并在生成的图像上工作的 PHP 命令失败,因为图像仍在生成中。我在 Windows 上工作,所以 pcntl_waitpid 不是一个选项。
我最初的方法是尝试让 PhantomJS 不断输出一些内容供 proc_open 读取。你可以看到我在这个线程中尝试过的内容:
只要创建了 png,就让 PHP proc_open() 读取 PhantomJS 流
我无法让它工作,似乎没有其他人可以为我提供解决方案。所以我现在要问的是如何让 proc_open 像 shell_exec 一样同步工作。我需要仅在 proc_open 命令结束后执行脚本中剩余的 PHP 命令。
根据第一个评论请求添加我的代码:
这是 PhantomJS 脚本:
如果不是“c:\phantomjs\phantomjs.exe /test.js”,而是使用 cmd.exe ping 表单示例,我会逐行打印 $return_message,所以我知道 proc_open 接收到一个流。我试图让幻影脚本也发生同样的事情。
php - 从 PHP 脚本运行 WP-CLI
我目前正在尝试从 php 脚本运行 wp cli命令。对于那些不熟悉WP-CLI的人来说,它是一个很酷的 Wordpress 命令行界面。以下是我的以下脚本:
在里面error-output.txt
我收到以下错误:
sh: /usr/local/bin/wp: Permission denied
据我所知,这是一个权限问题,其中apache
(执行我的 php 脚本的当前用户)由于某种原因无法执行wp
bin 文件。
出于好奇,我做了以下事情:
- 更改了我要运行的命令,该命令
wp --info
输出有关 wp-cli 的信息并且不需要写入另一个目录,我认为这可能是一个问题,但我被证明是错误的,因为我仍然得到permission denied
错误。 - 我试图将
wp
垃圾箱移到usr/bin
。这里也没有效果。 - 无奈之下,我什至尝试给
wp
777 权限,apache
但仍然无法执行。
我意识到这更多是服务器设置/权限问题(可能),但我觉得这将是最好的提问地点。
php - PHP中启动的外部进程的PID
我需要获取在 PHP 中执行的进程的 PID。接下来是我的问题的概述:
我有一个脚本,它执行两个外部程序(MatLab 中的过程)。第二个程序必须等待第一个程序的输出,如果用户需要,我需要这些进程的 PID 来杀死它们。
首先我使用了 exec() 但我知道如何获取 pid。我也使用了 proc_open() 但我需要第一个调用阻止脚本(第二个脚本的输入将存储在临时目录中,是一个图像),直到第一个进程结束。
我的环境是在 Windows 中。提前致谢。
php - PHP proc_open 阻塞读取到标准输出,直到 C 程序终止
我正在开发一个使用指纹扫描仪进行用户识别的应用程序。与指纹扫描仪的交互是在带有 libfprint 的 C 程序中完成的,我在 PHP 中使用 proc_open 调用该程序。指纹注册过程是一个由 libprintf 作为状态机处理的多阶段过程;控制在库和 C 程序之间传递,以允许 C 程序向用户提供反馈(阶段成功,不成功,以及为什么)...
尝试从 PHP 中的进程资源读取数据时出现问题。示例 PHP 代码在这里:
?>
我添加了 var_export 来缩小阻塞发生的范围。我的“opened”和“blah”输出正常,但“blah123”直到我完成指纹扫描仪的注册过程后才出现,此时指纹扫描仪的所有输出都随之而来。注册.c 应用程序几乎是 libfprint 附带的示例注册.c,在特定阶段成功时播放声音进行了一些修改。该程序的“重要”位在这里:
这是 C 程序终止后 PHP 应用程序的输出:
关于为什么fgets()
调用(也尝试过fread()
并stream_get_contents()
具有类似行为)阻塞直到 C 程序终止的任何想法?我希望在程序运行时得到输出。如果我切换到 using $cmd = "ping 127.0.0.1";
,它的行为与我预期的一样,在输出到标准输出时输出 ping 的每一行。
更新...已修复
Barmar 在下面是正确的,我只需要关闭输出缓冲....但是在这样做时,我遇到了一些奇怪的不一致,我想记录下来以供其他有类似问题的人使用...修复是
根据这个评论 应该相当于
但是使用setvbuf(stdout, NULL, _IONBF, 0);
,C 程序会输出一切都很好,以及setvbuf(stdout, NULL, _IONBF, 0);
. 有了setbuf(stdout, NULL);
,一切都很完美。
我发现非常有趣的是,使用类似以下的程序,PHP 脚本能够毫无问题地获取 stdio,而无需关闭输出缓冲......并且两个脚本都包含 stdio,因此两者都应该启用输出缓冲.. .
不管怎样,现在已经修好了。谢谢!
php - proc_open 在 foreach 循环中只调用了一次
以下场景:当我将执行器命令放入 foreach 循环时,执行器只被调用一次,而 foreach 循环的其余部分已死或永远挂起。
那么有什么问题呢?
这是电话...
问候萨沙
php - 使用 proc_open 时如何保持 STDIN 管道始终打开?
我在 Windows 上使用 PHP 脚本与国际象棋引擎进行通信。我建立连接如下:
我可以像这样向引擎发送命令:
我读了这样的引擎输出:
问题是我无法读取引擎输出,直到我像这样关闭标准输入管道:
这意味着每当我想与引擎交互时,我必须不断地打开和关闭连接(使用 proc_open)。
如何始终保持连接打开?
php - PHP:试图让 fgets() 同时触发 CRLF、CR 和 LF
我正在阅读 PHP 中的流,使用 proc_open 和 fgets($stdout),试图获取每一行。
许多 linux 程序(包管理器、wget、rsync)只是使用 CR(回车)字符来表示定期“就地”更新的行,比如下载进度。我想在这些更新发生时立即捕获它们(作为单独的行)。
目前, fgets($stdout) 一直读取到 LF,因此当进度非常缓慢(例如大文件)时,它会一直读取直到完全完成,然后将所有更新的行作为一个长字符串返回,包括CR。
我尝试设置“mac”选项以将 CR 检测为行尾:
但这似乎不起作用。
现在,stream_get_line 将允许我将 CR 设置为换行符,但不是将 CRLF、CR 和 LF 都视为分隔符的“包罗万象”解决方案。
我当然可以阅读整行,使用各种 PHP 方法拆分它,并用 LF 替换所有类型的换行符,但它是一个流,我希望 PHP 能够在它仍在运行时获得进度指示。
所以我的问题:
如何从 STDOUT 管道(从 proc_open)读取直到发生 LF或CR,而不必等到整行都进入?
提前致谢!
解决方案:
我使用 Fleshgrinder 的过滤器类将流中的 \r 替换为 \n (请参阅接受的答案),并将 fgets() 替换为 fgetc() 以获得对 STDOUT 内容的更多“实时”访问:
php - PHP:读取管道流时线程崩溃
我目前正在用 PHP 开发一个部署框架,但遇到了一些关于线程和流的问题。
我想启动一个进程,读取它的标准输出和标准错误(分开!),回显它并在进程终止时返回流的完整内容。
为了获得该功能,我使用了两个线程,每个线程都在读取不同的流(stdout|stderr)。现在我遇到的问题是当 fgets 被第二次调用时 php 崩溃了。(错误代码 0x5,错误偏移量 0x000610e7)。
经过大量的跟踪和错误后,我发现当我向run
函数添加一个虚拟数组时,崩溃并不总是发生并且它按预期工作。有谁知道为什么会这样?
我正在使用 Windows 7、PHP 5.4.22、MSVC9、pthreads 2.0.9
php - 使用 PHP proc_open 时限制对 Python 的访问
我正在开发一个带有解释器的 python 在线编辑器。我使用 php 的 proc_open() 函数调用 python。
但是有一个问题,显然有人执行了 python 的 shutil.rmtree() 函数并删除了我的整个网站。
如何限制访问,使python只能访问指定目录中的数据
php - 是否有必要关闭管道和 proc_close 进程
我正在使用脚本依次打开(proc_open
)从 5 到 50 个进程。他们每个人都做 cURL 并将结果发布到数据库。我不想等待他们的执行结果,我只想让他们在主脚本执行时和之后运行。我set_time_limit(10);
在每个进程文件中使用。
proc_close
等待进程终止,并返回其退出代码。proc_close
在网上我发现一旦主文件完全执行而不调用并且fclose
没有找到任何记录证明,php会自动关闭所有管道和每个进程。
所以问题是:是否有必要关闭管道和 proc_close 进程?如果 100-200 个用户同时运行此脚本并且它为每个用户打开 5 到 50 个进程proc_close
并且fclose
不被调用,这可能是一个问题。如果您有更优雅的方式来完成这项任务,请告诉我,但首先我需要获取有关我当前方法的信息。非常感谢。我用来调用每个进程的代码是(函数的一部分):