Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 对使用proc_open打开的进程的多次写入_Php_Process_Exec_Proc Open - Fatal编程技术网

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 any
fwrite()
在此上下文中的调用会立即将数据发送到程序,而我正在使用
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