是的,另一个程序是一个具有自己的外壳的交互式终端程序。如果我正常启动了另一个程序,即。通过终端而不是通过php proc_open,它将加载并显示命令提示符,例如my_program >>,我可以针对该命令提示符运行命令。我尝试将 n附加到$ command上,但是它不起作用。它将挂在stream_get_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在这种情况下,任何fwrite()调用都会立即将数据发送到程序,而我只是在玩用proc_open()执行一些交互式程序,它确实可以正常工作。我认为这是一些您无法提供给我的自定义程序,所以我自己可以玩吗?解决此问题的一种可能的方法(尽管非常丑陋)是将telnet / SSH插入自己并以这种方式执行,因为这样,您要处理的PHP流将基于套接字,因此您可以使用set timeouts等,此外,您只有处理所有I / O操作的一个流
程序被称为gap,它是一个开放源代码的代数数学程序。由于某些错误,最新版本无法与proc_open配合使用,但版本4.4.12可以使用,您可以在此处获取它,您需要这两个软件包-ftp.gap-system.org/pub/gap/gap44/tar.gz/gap4r4p12。 tar.gz ftp.gap-system.org/pub/gap/gap44/tar.gz/ ...第一个软件包中有一个带有安装说明的自述文件,基本上您只需键入configure然后./make即可,其v很简单。
telnetting / ssh太多了,有更简单的解决方法,但是最好的方法是,只要我可以对STDIN进行多次写入,而不必关闭管道。
@Jim_CS好吧,当我回到一台合适的Linux机器上时,我会遇到麻烦-在工作中,我只有Windoze并假装Linux(在MIPS上使用BusyBox且没有gcc的旧内核)。约4个小时后,我会尽快回复您
@Jim_CS这很奇怪,而且没有我想像的那么简单,似乎确实悬而未决,直到EOF出现在STDIN上。我认为这里必须在幕后做更多的事情,因为它不能通过控制tty来完成,所以我将深入研究差距的根源,看看我是否能弄清楚这里发生的事情-我会回来的给你。如果您自己找到解决方案,请告诉我。
是的,这很奇怪。似乎使用proc_open与通过终端启动程序并不完全相同,因为使用proc_open打开最新版本的gap(版本4.5.5和4.5.4)是无效的,并且会引发错误,而在常规终端中可以正常打开。
@Jim_CS这是因为他们将检查isatty(),您可以使用上述telnet / SSH方法来解决。我仍在尝试提出更好的解决方案...
有趣的是,这似乎表明您正在做的事情应该是可能的:What you can do is to run GAP in a child process and communicate with it using pipes, pseudo-ttys, UNIX FIFOs or some similar device