问题标签 [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 投票
0 回答
303 浏览

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 接收到一个流。我试图让幻影脚本也发生同样的事情。

0 投票
0 回答
1817 浏览

php - 从 PHP 脚本运行 WP-CLI

我目前正在尝试从 php 脚本运行 wp cli命令。对于那些不熟悉WP-CLI的人来说,它是一个很酷的 Wordpress 命令行界面。以下是我的以下脚本:

在里面error-output.txt我收到以下错误:

sh: /usr/local/bin/wp: Permission denied

据我所知,这是一个权限问题,其中apache(执行我的 php 脚本的当前用户)由于某种原因无法执行wpbin 文件。

出于好奇,我做了以下事情:

  1. 更改了我要运行的命令,该命令wp --info输出有关 wp-cli 的信息并且不需要写入另一个目录,我认为这可能是一个问题,但我被证明是错误的,因为我仍然得到permission denied错误。
  2. 我试图将wp垃圾箱移到usr/bin。这里也没有效果。
  3. 无奈之下,我什至尝试给wp777 权限,apache但仍然无法执行。

我意识到这更多是服务器设置/权限问题(可能),但我觉得这将是最好的提问地点。

0 投票
1 回答
138 浏览

php - PHP中启动的外部进程的PID

我需要获取在 PHP 中执行的进程的 PID。接下来是我的问题的概述:

我有一个脚本,它执行两个外部程序(MatLab 中的过程)。第二个程序必须等待第一个程序的输出,如果用户需要,我需要这些进程的 PID 来杀死它们。

首先我使用了 exec() 但我知道如何获取 pid。我也使用了 proc_open() 但我需要第一个调用阻止脚本(第二个脚本的输入将存储在临时目录中,是一个图像),直到第一个进程结束。

我的环境是在 Windows 中。提前致谢。

0 投票
1 回答
592 浏览

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,因此两者都应该启用输出缓冲.. .

不管怎样,现在已经修好了。谢谢!

0 投票
1 回答
173 浏览

php - proc_open 在 foreach 循环中只调用了一次

以下场景:当我将执行器命令放入 foreach 循环时,执行器只被调用一次,而 foreach 循环的其余部分已死或永远挂起。

那么有什么问题呢?

这是电话...

问候萨沙

0 投票
1 回答
575 浏览

php - 使用 proc_open 时如何保持 STDIN 管道始终打开?

我在 Windows 上使用 PHP 脚本与国际象棋引擎进行通信。我建立连接如下:

我可以像这样向引擎发送命令:

我读了这样的引擎输出:

问题是我无法读取引擎输出,直到我像这样关闭标准输入管道:

这意味着每当我想与引擎交互时,我必须不断地打开和关闭连接(使用 proc_open)。

如何始终保持连接打开?

0 投票
1 回答
2129 浏览

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)读取直到发生 LFCR,而不必等到整行都进入?

提前致谢!

解决方案:

我使用 Fleshgrinder 的过滤器类将流中的 \r 替换为 \n (请参阅接受的答案),并将 fgets() 替换为 fgetc() 以获得对 STDOUT 内容的更多“实时”访问:

0 投票
1 回答
267 浏览

php - PHP:读取管道流时线程崩溃

我目前正在用 PHP 开发一个部署框架,但遇到了一些关于线程和流的问题。

我想启动一个进程,读取它的标准输出和标准错误(分开!),回显它并在进程终止时返回流的完整内容。

为了获得该功能,我使用了两个线程,每个线程都在读取不同的流(stdout|stderr)。现在我遇到的问题是当 fgets 被第二次调用时 php 崩溃了。(错误代码 0x5,错误偏移量 0x000610e7)。

经过大量的跟踪和错误后,我发现当我向run函数添加一个虚拟数组时,崩溃并不总是发生并且它按预期工作。有谁知道为什么会这样?

我正在使用 Windows 7、PHP 5.4.22、MSVC9、pthreads 2.0.9

0 投票
0 回答
39 浏览

php - 使用 PHP proc_open 时限制对 Python 的访问

我正在开发一个带有解释器的 python 在线编辑器。我使用 php 的 proc_open() 函数调用 python。

但是有一个问题,显然有人执行了 python 的 shutil.rmtree() 函数并删除了我的整个网站。

如何限制访问,使python只能访问指定目录中的数据

0 投票
0 回答
236 浏览

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不被调用,这可能是一个问题。如果您有更优雅的方式来完成这项任务,请告诉我,但首先我需要获取有关我当前方法的信息。非常感谢。我用来调用每个进程的代码是(函数的一部分):