PHP proc_open on windows

16
我使用proc-open创建了一个进程,但在Windows下,stream-select不起作用。我想要实现的目标是同时从stdoutstderr读取,同时写入stdin,并确保输出与输入相匹配。在Windows上有没有解决这个问题的方法?

2
我认为你唯一能做的就是将管道设置为非阻塞模式并手动检查它们,不幸的是。 - netcoder
1
@netcoder - 我已经尝试过了。stream_set_blocking返回false :-( - Ed Heal
标准错误和标准输出无法设置为非阻塞状态。您到底想要实现什么?有一些代码吗?在这里可能不需要使用select。 - Pierre
@galymzhan - 这两个流的不同之处在于它们来自两个不同的文件描述符。此外,有时候没有任何内容可供读取。 - Ed Heal
@EdHeal 我想建议将 stderr 重定向到 stdout,这样你只需要关注 stdout。不过我不确定如何实现非阻塞访问。 - galymzhan
显示剩余2条评论
2个回答

1

关于在Windows上使用stream-select出现问题,您没有提供太多详细信息。然而,以下是如何使用stream-select的工作示例。我刚刚在Windows XP上成功地运行了PHP 5.4。

编辑:嗯...看起来最终还是不起作用...抱歉,在这里进行更多测试.. :)

再次编辑:

所以,我对此进行了更多的实验,但没有成功。

也许你应该让进程彼此使用TCP/UDP/IP通信?

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

或者也许换成类似unix的操作系统?;)好的,今晚就这样。晚安


1
在你的例子中,stream_select 似乎是无用的。它只是从 stdoutstderr 管道中读取数据,而没有实际查看 $read_streams 中返回的内容。如果子进程很忙(或者当你正在等待 stdout 上的数据时,子进程写入了 stderr),这可能会导致阻塞。 - galymzhan
1
@AlfredGodoy - 问题在于Windows中的select不起作用。但是在Unix / Linux上似乎可以工作。对于无法正常运行的代码,抱歉浪费了您的努力。 - Ed Heal
@AlfredGodoy - 你因为努力获得了赏金。不应该浪费掉。 - Ed Heal
谢谢 :) 在答案中添加了更多的想法。 - Alfred Godoy
@AlfredGodoy - 我会把你加入我的善良人名单。 - Ed Heal
@AlfredGodoy - 问我一个问题,我会尽力给你一个答案。 - Ed Heal

1

添加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)
    );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接