问题标签 [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 回答
1570 浏览

php - 没有得到 popen 的全部回复

嗨,我正在使用 popen 运行一个进程;-

而且我只从返回 5 行的过程中得到 3 行。我在 CLi 中运行这个确切的命令,我会得到更多的响应。就好像它提前停止阅读(它可能需要时间才能完成并在工作时更新接下来的 2 行,这是一个进度指示器)。

我做错什么了吗?proc_open是否更合适(我已经开始看看是否可以尝试)。

0 投票
1 回答
903 浏览

php - 使用proc_open时如何处理无限循环过程

我使用 proc_open 来执行一个由 c 语言创建的程序。

我正在使用文件作为“stdout”。

当我执行好的程序时一切都很好,但是当我执行无限循环程序时出现问题,如下面的代码:

文件 example.output 将使我的硬盘已满。所以我需要删除文件并重新启动计算机。我的问题是如何处理这样的事情?

谢谢 :)

0 投票
1 回答
1672 浏览

php - 将 php proc_open() 与多个输入流一起使用。防止挂起

似乎我在使用 proc_open() php 函数时使用管道传输到进程的流时遇到问题。

我开始的过程只是转换 ImageMagick 实用程序,将 3 个图像叠加在一起。当仅使用 1 个输入流 (STDIN) 并将一个变量转储到该流中时,转换程序可以正常工作并返回其输出,该输出可以存储在一个变量中,如下所示:

首先,我运行转换并将输出存储在 $ctext_opacity 变量中。然后通过 proc_open() 调用下一个命令,并且 $ctext_opacity 变量通过 STDIN 管道传输并用作输入图像:

上述命令被调用 3 次,生成了 3 个单独的图像并存储在 3 个变量中。下一个命令应该接受这 3 个变量作为输入图像(ImageMagic 语法指定替代 io 流,如 fd:N,其中 N 是我通过 proc_open() 生成的流的编号)。但是,我似乎正在错误地写入输入流或从 STDOUT 读取,这很可能导致进程未刷新输出,导致进程挂起而不终止。

我似乎无法传输 3 和 4 管道的内容,因为 convert 会抛出空/不正确数据的错误

0 投票
1 回答
952 浏览

pipe - 使用 proc_open() 加载 .profile

情况如下:我编写了一个后端应用程序,它在某个服务器上运行。在此服务器上,有一个脚本可以通过 ssh 从前端服务器执行。然后我的脚本将检查它需要的环境变量是否正确加载,因为我在脚本本身中严重依赖它们。

这行得通,虽然不是我想要的工作方式。建立连接后,./profile 不会加载,只是 usingexec('source /home/user/.profile');不起作用,当然。由于脚本已经在运行。这就是脚本这样开始的原因:

该帮助脚本是一个 ksh 脚本:

加载配置文件,并再次调用第一个脚本。我希望第二个脚本消失,我觉得它很愚蠢......需要第二个脚本来运行第一个脚本。我知道可以使用 proc_open 设置环境值,但是将 .profile 重写为数组听起来更加愚蠢。我还尝试了proc_open一个 shell,加载配置文件并从其内部再次运行脚本。只是发现脚本一直在调用自己,让我相信配置文件根本没有加载。

到目前为止,这是我的尝试:

到目前为止我没有运气,谁能告诉我我是否在这里忘记了什么?我究竟做错了什么?我在这里忽略了什么吗?

0 投票
1 回答
3534 浏览

ssh - proc_open 交互

这是我想要实现的目标:打开一个 shell(korn 或 bash,没关系),从那个 shell,我想打开一个 ssh 连接(ssh user@host)。在某些时候,可能会提示我输入密码,或者可能会询问我是否确定要连接(有问题的键)。

在有人问之前:是的,我知道有一个用于 ssh2 exec 调用的插件,但是我正在使用的服务器不支持它,而且不太可能这样做。

这是我到目前为止所尝试的:

stream_get_contents($pipes[1])然后我尝试读取控制台输出'connection failed: '.stream_get_contents($pipes[1])

这给了我以下错误:

不会分配伪终端,因为 stdin 不是终端。

所以,我虽然在 io-stream 上下文中调用了 ssh,但php://似乎是对上述错误的合理解释。

下一步:我想到了我的第一个 SO 问题,并决定先打开一个 bash/ksh shell 可能是个好主意:

从那里拿走它,但我得到了完全相同的错误消息,只是这一次,脚本停止运行,但 ssh 确实运行了。所以我充满希望,然后感到愚蠢,最终绝望:

等待几秒钟后,我收到以下错误:

PHP致命错误:允许的内存大小为134217728字节已用尽(试图分配133693440字节)

即使在我最后一次绝望的尝试中,调用堆栈也会不断调出 stream_get_contents 行:

我知道,它一团糟,有很多fflush冗余,但重点是:我知道这个连接会首先提示我输入违规密钥,然后询问密码。我的猜测是 $pipes[1] 中的流包含 ssh 连接,因此它的内容很大。那么我需要的是管道内的管道......这甚至可能吗?我一定遗漏了一些东西,如果这是不可能的,那么管道有什么好处......我的猜测是 proc_open 命令一开始是错误的,(错误:管道损坏)。但我真的看不到第一个错误的任何其他方式......有什么想法吗?或者如果上述咆哮根本不清楚(可能不是),请跟进问题。

0 投票
2 回答
986 浏览

php - proc_open:扩展文件描述符编号以启用来自 Perl 脚本的“状态”反馈

PHP 的proc_open手册指出:

文件描述符编号不限于 0、1 和 2 - 您可以指定任何有效的文件描述符编号,并将其传递给子进程。这允许您的脚本与作为“协同进程”运行的其他脚本进行互操作。特别是,这对于以更安全的方式将密码短语传递给 PGP、GPG 和 openssl 等程序很有用。它对于读取那些程序在辅助文件描述符上提供的状态信息也很有用。

发生了什么: 我在基于 PHP 的 Web 应用程序中调用 Perl 脚本并在调用中传递参数。我以后不需要向脚本发送数据。通过标准输出 [1],我从我在 PHP 应用程序中使用的 Perl 脚本 json_encoded 数据中接收到这些数据。

我想补充 的是:Perl 脚本正在通过网站收集信息,具体取决于在其初始调用中传递的参数。我想向 PHP 应用程序发送回一个文本字符串,我可以用它来显示为一种进度条。

我认为我应该怎么做:我希望(每 1-2 秒)轮询为该“进度”更新设置的频道。我会使用 Javascript / jQuery 写入一个 html div 容器供用户查看。我认为我不应该将“进度”通道与更关键的“json_encode(数据)”通道混合,因为我需要破译标准输出流。(这个想法合乎逻辑、实用吗?)

我的主要问题: 您如何使用其他“文件描述符”?我会将附加通道的设置想象为简单明了,例如下面的 3 => ...:

但是,在 Perl 脚本中,我只是像这样写到标准输出:

如果我对设置附加通道的理解是正确的(上面是 3 => ...),那么我将如何在 Perl 脚本中写入它?

谢谢

0 投票
3 回答
2154 浏览

php - PHP proc_open 环境变量

我正在尝试使用proc_open()函数运行进程。正如页面上指定的 - 我提供了自定义环境变量并尝试打印出来。它显示了我提供的所有变量 + 总是 3 个变量:'SHVLL'、'PWD'、'_='。我只想打印/使用我提供的环境变量。这 3 个总是与此功能一起出现吗?有没有办法只提供变量?这一切都在 Linux 和 PHP5 下。

谢谢。

0 投票
2 回答
1209 浏览

php - 在 psql 查询中使用 proc_open() 进行交互式提示

我正在尝试从 Web 界面执行一些 PostgreSQL DB 命令。我使用 proc_open() 管道到 Windows 命令提示符。因为 psql(和所有其他 postgres 命令)不接受密码作为选项,所以我必须将密码发送到写入流。下面的代码会导致浏览器挂起。要么没有创建资源,要么没有正确传输密码。在这一点上,欢迎提出任何建议。

[你会注意到命令中疯狂的双双引号——这显然是 windows 出于某种原因需要的。]

欢迎解决此问题:

  • 我之前尝试过使用 system() 和 exec() 但因为它们不处理交互式提示而放弃了。php中是否有更好的交互选项?
  • pg_query() 是与 postgres DB 交互的主要命令,但不支持 pg_dump 和 pg_restore 操作。是否有另一种方法可以从二进制 postgres .backup 文件进行备份和恢复,可以用 php 完成?
0 投票
1 回答
555 浏览

php - 为 PHP exec() 方法传递交互式参数

需要帮助来实现以下内容。我有一个 C 程序文件如下:

我生成了 a.out,现在我想使用 exec("a.out", $output) 来调用它。但我的问题是我得到了如何在它要求时传递整数的值。我尝试使用 proc_open() 但我无法理解它的用法。如果您能给我一段 PHP 代码,它可以处理这个以传递这两个值并最终打印收到的结果,我将不胜感激。

此致

0 投票
1 回答
962 浏览

php - 从 php 脚本执行 proc_open 以连接到 pgsql 时出错

我的 PHP 脚本试图将 .sql 文件导入 postgres DB(Cent OS)。

要从它使用的 PHP 脚本连接数据库:

它向我显示错误:“无法启动 pgsql”。

当我从 proc_open 中删除 @ 符号时,它会显示错误消息....

" proc_open() [<a href='function.proc-open'>function.proc-open</a>]: Descriptor item must be either an array or a File-Handle in <b>/home/nominati/public_html/Nominatim/utils/setup.php"

虽然 $aDescriptors 已经是一个数组。是否有任何与用户权限相关的问题?

提前致谢。