Php 对使用proc_open打开的进程的多次写入
因此,我用Php 对使用proc_open打开的进程的多次写入,php,process,exec,proc-open,Php,Process,Exec,Proc Open,因此,我用$process=proc\u open(“我的进程,$descriptor,$pipes”)打开一个进程 然后,我使用fwrite($pipes[0],“some_命令”)写入进程的stdin 然后我必须使用fclose($pipes[0])关闭管道在我可以使用$output=stream\u get\u contents($pipes[1])读取管道标准输出之前。如果我不关闭管道,我的php脚本将挂起此调用 但是一旦我收到stdout的输出,如果我想向进程发送另一个命令,该怎么办?
$process=proc\u open(“我的进程,$descriptor,$pipes”)打开一个进程代码>
然后,我使用fwrite($pipes[0],“some_命令”)写入进程的stdin代码>
然后我必须使用fclose($pipes[0])关闭管道代码>在我可以使用$output=stream\u get\u contents($pipes[1])读取管道标准输出之前代码>。如果我不关闭管道,我的php脚本将挂起此调用
但是一旦我收到stdout的输出,如果我想向进程发送另一个命令,该怎么办?stdin管道已关闭,因此我无法发送它。那么,是否有可能以某种方式向进程发送另一个命令?听起来另一个进程正在阻塞等待STDIN上的EOL或EOF。你想执行什么
无论如何,这很有可能解决问题:只需将\n
附加到发送到另一个进程的命令中即可
例如
现在,您可能也遇到了一个问题,即您正在使用stream\u get\u get\u contents()
——这将等待EOF返回。对于如何使用fgets()
从$pipes[1]
检索数据,并查找特定数量的行或字符串以指示输出的结束,您可能需要更加智能一些
如果你告诉我们你正在执行什么,我可能会给你一个更具体的答案。是的,另一个程序是一个有自己外壳的交互式终端程序。如果我“正常”启动另一个程序,即通过终端而不是通过php proc\u open,它将加载,然后显示一个命令提示符,如“my\u program>>”,我可以对其运行命令。我已尝试将“\n”附加到$命令,但无效。它将挂起在stream\u get\u contents()上。使用fflush()也不起作用,它只在我关闭$pipes[0]时起作用。@Jim_CS尝试上面的代码,但战后只是echo fgetc($pipes[1])代码>-只需尝试从另一个程序的STDOUT中提取1个字符,并在PHP中进行回显。我猜是您的读取操作导致了阻塞,而不是另一个进程等待更多输入/EOF。如果这不起作用,请尝试从另一个进程的STDERR获取数据,它可能会输出您想要的数据。另一个程序会输出一些启动文本,例如“已加载的模块:abc、xyz等…”。因此,如果我使用带有$output[]=fgets[$pipes[1])的while循环,它首先会获得大约8行启动文本。如果我使用了fclose($pipes[0]),它将为我提供处理我发送的命令的输出。但是,如果我附加“\n”或使用flush()它将获得8行启动文本,但当它应该从我的命令中检索输出时,它将挂起。在我看来,我的命令没有被发送到程序的STDIN,就好像它被发送一样,我将能够检索结果。@Jim_CS AFAIK anyfwrite()
在此上下文中的调用会立即将数据发送到程序,而我正在使用proc\u open()
执行一些交互式程序,它似乎确实有效。我认为这是一些自定义程序,您无法提供给我,因此我可以自己使用它?一种可能(尽管非常难看)解决这一问题的方法是将telnet/SSH引入您自己并以这种方式执行,因为您处理的PHP流将是基于套接字的,因此您可以使用设置超时等,此外,您只需为所有I/O操作处理一个流。该程序名为gap,是一个开源代数数学程序。最新版本是doe由于一些错误,snt无法使用proc_open,但4.4.12版确实可以,您可以在这里获得它,您需要这两个软件包-…第一个软件包中有一个带有安装说明的自述文件,基本上您只需键入“configure”然后键入“/make”,其v简单明了。
$process = proc_open("my_process", $descriptors, $pipes);
$command = "some_command";
fwrite($pipes[0], $command."\n");
// Fetch the contents of STDOUT