使用proc_open打开对进程的多次写入

时间:2012-07-24 13:48:25

标签: php process exec proc-open

所以我用$process = proc_open("my_process", $descriptors, $pipes);

打开一个流程

然后我使用fwrite($pipes[0], "some_command");

写入流程的标准输入

然后我必须使用fclose($pipes[0]);关闭管道,然后才能使用$output = stream_get_contents($pipes[1]);从管道stdout读取。如果我不关闭管道,那么我的php脚本就会挂起来。

但是一旦我收到了stdout的输出,如果我想向进程发送另一个命令... stdin管道已关闭,所以我无法发送它。那么有可能以某种方式向进程发送另一个命令吗?

1 个答案:

答案 0 :(得分:2)

听起来其他进程阻止在STDIN上等待EOL或EOF。你想要执行什么?

无论如何,这很有可能将其解决:只需将\n附加到您要发送给其他进程的命令。

E.g。

$process = proc_open("my_process", $descriptors, $pipes);

$command = "some_command";
fwrite($pipes[0], $command."\n");

// Fetch the contents of STDOUT

现在,您可能遇到的一个问题是您正在使用stream_get_get_contents()这一事实 - 它会在返回之前等待EOF。您可能需要更加智能地了解如何从$pipes[1]检索数据,使用fgets()并查找特定数量的行或字符串以指示输出结束。

如果你告诉我们你正在执行什么,我可能会给你一个更具体的答案。