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

php - 通过PID获取进程资源

我想写 web SSH 控制台,我发现了两个问题。

我想做的事。首先,我想执行start.php具有以下代码的文件。

其次,我想运行command.php在文件中创建的进程上运行命令的start.php文件并从中获取结果。

我只想访问cmd过去创建的进程(),向它发送命令并获得结果。

为什么这是问题,如果我可以为每次command.php执行创建新进程?因为新进程是新会话,如果我在过去command.php的执行中登录到 mysql,在下一次执行中我必须再次登录到 mysql,因为新进程不记得我已登录。

窗户上的例子。

  1. cmd我在 PHP 中创建新进程 ( ),我的当前目录是C:\WebServ\.

在此处输入图像描述

  1. 我写cd /命令,我的当前目录是C:\.

在此处输入图像描述

这只是示例,我不想只更改目录,这对我来说不是问题。

问题是如何创建一个进程并在下一次 PHP 文件执行中访问它 -mysql例如,如果我想记住会话?

  1. 我可以按proc_open功能创建流程。
  2. 我可以通过 PID 获取 PID get_process_status,但是如何获取在当前 PHP 文件执行之前创建的进程资源?

下一个问题,如果可以访问过去创建的进程,如何向创建的进程编写新命令?

我不想使用 PHP 扩展。但是,如果在这种情况下需要这样做,每个答案都会对我有所帮助。

如果无法访问在其他 PHP 执行中创建的进程,我想while(1)在 PHP 执行开始时控制创建的进程 - 但我希望在这种情况下不需要这样做。 然后我希望有人知道,如何为创建的cmd进程编写新命令。


如果我的问题的解决方案有问题,我将接受告诉我如何发送命令到cmd.exe由打开的进程shell_exec以及如何接收每个命令的响应的答案。

0 投票
1 回答
887 浏览

php - PHP:在中间服务器上即时压缩文件流,而不存储(太多)数据

有关的:

我正在寻找其他主题中描述的方法的组合。我可能需要以小块读取文件(从 URL) ,将它们通过管道传输到 proc_open zip 命令的 STDIN,获取输出并将其刷新到客户端。

我需要做什么:

  • 从存储服务器的 URL 读取文件流
  • 在网络服务器上即时压缩
  • 使用未知大小的内容配置将其作为下载提供到网络浏览器(毕竟它是一个流)。

我不能做的:

  • 在网络服务器上存储文件
  • 在存储服务器上运行代码
  • 使用大量内存
  • 让客户端等待下载

因此,数据的刷新需要在远程块读取仍在进行中时开始。

这在PHP中可能吗?我觉得这在提供更多回调/异步功能的语言中会容易得多,但在这种情况下我坚持使用 PHP。

非常欢迎任何示例或一些粗略的代码!

0 投票
1 回答
874 浏览

php - php后台进程使用proc_open

我想打开一个进程

并且仍然有能力检查它的状态(.ie running?)这可能吗?

当我尝试使用

并检查

尽管进程正在运行,但它返回 false ...

谢谢

0 投票
1 回答
3242 浏览

php - 尝试从流中读取时 proc_open 挂起

proc_open在 Windows 上遇到了问题,尝试使用 转换 wmv 文件(到 flv)时ffmpeg,但是我怀疑每当发生某些情况时我都会遇到相同的情况。
基本上我的代码如下:

stream_get_contents现在,这段代码将导致 PHP 无限期挂起(我是否使用fgetsor来代替并不重要stream_select,行为是一致的)。

其原因(我怀疑)是,虽然 STDOUT 流成功打开,但该进程不会向其写入任何内容(即使在 cmd 中运行相同的命令会显示输出),因此,尝试从此类流中读取,会导致与此处描述的相同的问题,因此 - PHP 等待流中包含任何内容,进程不会向其中写入任何内容。

但是(额外的乐趣),设置stream_set_timeoutstream_set_blocking没有任何效果。

因此 - 有人可以确认/否认正在发生的事情,如果可能的话,展示我如何应对这种情况?我查看了 PHP 错误,所有错误proc_open hangs似乎都已修复。

暂时我已经实施了这样的解决方案:

但是,我真的不想依赖这样的东西:

  1. 我将有运行超过一分钟的进程 - 这些进程将被错误地报告为上述类型
  2. 我想知道 ffmpeg 何时完成视频转换 - 目前我只会在一分钟后知道该进程仍在运行,我无法真正做任何事情来检查是否有任何输出(因为它会挂起 PHP)。

此外,我真的不想等待一整分钟来检查该过程(例如 - 从命令行转换给定的视频需要 <10 秒),而且我会有需要更多时间来转换的视频。


根据@Sjon 的评论,这是stream_select我正在使用的,由于相同的问题而阻塞 - STDOUT 未写入:


每次与@Sjon 的对话 - 从 Windows 上的缓冲流中读取数据被破坏。最终的解决方案是通过shell使用流重定向,然后读取创建的文件 - 这样

由于流是缓冲的,在文件中我们将得到无缓冲的输出(我也在追求)。而且我们不需要检查文件是否更改,因为来自 shell 的结果是无缓冲且同步的。

0 投票
1 回答
537 浏览

php - Php proc_open - 将进程句柄保存到文件并检索它

我使用以下代码使用 proc_open 打开进程,并将句柄和管道保存到文件中:

然后我需要从文件中检索这个文件句柄,我使用了这个代码:

但是,当我在从文件中检索后打印 $processHandle 和 $pipes 的 var_dump 时,我会得到整数而不是资源或进程,但是为什么呢?

当然,在这一点上,如果我尝试关闭管道,我会得到一个错误,资源预期,给定整数。

我怎样才能使它工作?(注意:这是我正在寻找的解决方案)

但或者,我也可以获取进程的 pid,然后使用这个 pid 来停止或杀死进程或对进程执行任何其他操作,但是管道呢?如何从/向进程读取/写入或保存错误?

谢谢

0 投票
1 回答
118 浏览

php - 弄乱一个命令的环境变量

我目前正计划使用 Symfony 的 ProcessBuilder,它允许设置一些将传递给proc_open调用的环境变量。

我需要某个命令来更改TMPDIR,然后再恢复它,所以我想知道是否$TMPDIR在调用后恢复修改后的 env (以及修改后的 env 变量的值),还是需要恢复它我自己?如果需要特定命令(在我的情况下是ghostscript),这个值是否真的会改变?

谢谢

0 投票
0 回答
923 浏览

php - 刷新PHP页面中长进程的输出

我有一个“长”脚本,我想在 PHP 页面中执行,我希望脚本输出后立即“刷新”它的输出。我已经阅读了很多解决方案,例如问题 470652591820948882383PHP Flush Manual但在我的情况下它没有按预期工作!

我的测试脚本:

为 www-data 设置了可执行权限。

我的 PHP 页面:

注意。我的测试脚本 test.sh 位于 PHP 页面上方的目录中,即 ../test.sh。并不是说这会改变任何事情。但这不是错字。

我的php.ini有这些(虽然,我不太热衷于更改服务器范围,但我想测试这是否是问题):

我用灯。

如果我在终端中运行 PHP 页面

$ php 测试.php

它工作正常:我立即得到“这是一个测试脚本”和“正在睡觉”,过了一会儿,“完成”。

如果我在浏览器中加载页面,它就不起作用它会等到 test.sh 完成后再输出任何东西。

编辑:如果我在循环中添加 echo str_pad('',4096)."\n" ,那么它可以工作。但是,此修复程序表明由于我不明白的原因,输出缓冲仍设置为其默认值 (4096),而不是在我尝试配置时关闭。

此外,这个解决方案并不完美,因为实际上它在输出中添加了空格。

我正在寻找一个解决方案

  • 刷新 PHP 页面的输出
  • 不修改 php.ini
  • 不修改输出

谢谢!

0 投票
1 回答
1178 浏览

symfony - Symfony2 Pdf生成

我需要生成一个 PDF,我使用 SpreadPdfGeneratorBundle,问题是这个包使用了我的 webHosting“ex2”禁用的“proc_open”功能,我联系了他们,他们告诉我他们无法启用这个功能。PDF 生成在语言环境中运行良好。这是代码:

错误消息是:

警告:proc_open() 出于安全原因已被禁用(500 内部服务器错误)

谢谢您的帮助。

0 投票
1 回答
208 浏览

php - 如何从使用 proc_open 仅打开一次的文件中获取多个结果?

我有一个使用 exec() 运行的命令,它从一个非常大的数据文件中返回一个值,但它必须运行数百万次。为了避免每次都在循环中打开文件,我想转向proc_open基于 - 的解决方案,为了提高效率,文件指针只创建一次,但不知道如何做到这一点。

这是exec基于 - 的版本,它可以工作但速度很慢,大概是因为它必须在每次迭代中打开文件:

我对基于 - 的代码的尝试proc_open如下:

这正确地获取了第一个值,但随后为每个后续迭代生成了一个错误:

0 投票
1 回答
693 浏览

php - 为什么 exec 和 proc_open 在 IIS 上以不同的用户运行?

我在 Windows Server 2012 R2 和 IIS 8.5 上运行我的网站,但遇到了问题。

  • 当我运行时exec('whoami'),它会返回nt authority\iusr
  • 当我运行proc_open('whoami', $desc, $pipes)时,结果是iis apppool\mysite

为什么会这样?