【问题标题】:PHP proc_open on windowsWindows 上的 PHP proc_open
【发布时间】:2018-12-13 13:16:21
【问题描述】:

我使用proc-open 创建了一个进程,但在Windows 下stream-select 不起作用。我想要实现的是同时读取 stdoutstderr,同时写入 stdin 并确保输出可以匹配与输入。 windows 是否有解决此缺陷的解决方法?

【问题讨论】:

  • 不幸的是,我认为您唯一能做的就是将管道设置为非阻塞模式并手动检查它们。
  • @netcoder - 我试过这个。 stream_set_blocking 返回 false :-(
  • stderr 和 stdout 不能设置为非阻塞。你到底想达到什么目的?有一些代码吗?此处可能不需要选择。
  • 你能区分打印到stderr 的消息和打印到stdout 的消息吗(例如使用某种正则表达式)?
  • @galymzhan - 这两个流的不同之处在于它们来自两个不同的文件描述符。此外,有时没有什么可读的。

标签: php windows


【解决方案1】:

对于在 Windows 上使用流选择不适合您的内容,您不是很详细。但是,这是一个关于如何使用流选择的工作示例。我刚刚在 Windows XP 上使用 PHP 5.4 成功运行了它。

编辑: Uhhmmm .. 好像它根本不起作用......对不起,在这里测试更多...... :)

再次编辑:

所以,我对此做了更多的试验,但没有成功。

也许你应该让进程互相说 TCP/UDP/IP?

另一种方法(如果您仍想在您的进程中使用 stdout/stdin/stderr)可能是使用带有文件处理程序的 proc_open,因此您的进程正在写入文件,然后使用类似于 unix 的 inotify,加载这个东西与 PHP DOTNET 类:Is there anything like inotify on Windows? 来检测对文件的更改......?只是一个想法......

或者改成类似unix的操作系统? ;) 好的,今晚就到这里。晚安

【讨论】:

  • stream_select 在您的示例中似乎没用。它只是从stdoutstderr 管道中读取,而没有真正查看$read_streams 中返回的内容。如果子进程很忙(或者当您在stdout 上等待数据时,子进程写入stderr),这可能会阻塞
  • @AlfredGodoy - 问题是 Windows select 不起作用。但是 unix/linux 似乎可以工作。抱歉,代码不起作用。
  • @AlfredGodoy - 你得到了努力的赏金。不应该浪费。
  • Thnx :) 在答案中添加了更多关于此的想法。
  • @AlfredGodoy - 我会把你列入我的好人名单。
【解决方案2】:

添加 bypass_shell 对我有用

$proc=proc_open($cmd,
        array(
            0=>array('pipe', 'r'), //stdin
            1=>array('pipe', 'w'), //stdout
            2=>array('pipe', 'w')  //stderr
            ),
        $pipes,
        $dir,
        null,
        array('bypass_shell'=>true)
    );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-12
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    相关资源
    最近更新 更多