我使用
proc-open
创建了一个进程,但在Windows下,stream-select不起作用。我想要实现的目标是同时从stdout和stderr读取,同时写入stdin,并确保输出与输入相匹配。在Windows上有没有解决这个问题的方法?proc-open
创建了一个进程,但在Windows下,stream-select不起作用。我想要实现的目标是同时从stdout和stderr读取,同时写入stdin,并确保输出与输入相匹配。在Windows上有没有解决这个问题的方法?关于在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的操作系统?;)好的,今晚就这样。晚安
stream_select
似乎是无用的。它只是从 stdout
和 stderr
管道中读取数据,而没有实际查看 $read_streams
中返回的内容。如果子进程很忙(或者当你正在等待 stdout
上的数据时,子进程写入了 stderr
),这可能会导致阻塞。 - galymzhanselect
不起作用。但是在Unix / Linux上似乎可以工作。对于无法正常运行的代码,抱歉浪费了您的努力。 - Ed Heal添加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)
);
stream_set_blocking
返回false :-( - Ed Healstderr
重定向到stdout
,这样你只需要关注stdout
。不过我不确定如何实现非阻塞访问。 - galymzhan