proc_open(php => java)有多个输入流吗?

时间:2013-08-02 09:45:58

标签: java php proc-open

我在php中使用proc_open来调用java应用程序,向它发送一个大文本进行处理并捕获返回的结果。是否可以传递多个文本字符串(输入流)而不只是一个?

这就是我现在所得到的:

fwrite($pipes[0], $input);
fclose($pipes[0]);

$output = stream_get_contents($pipes[1]);
fclose($pipes[1]);

如果我这样做,java仍会将其识别为一个输入流:

fwrite($pipes[0], $input);
fwrite($pipes[0], $input1);
fwrite($pipes[0], $input2);
fclose($pipes[0]);

$output = stream_get_contents($pipes[1]);
fclose($pipes[1]);

这样的事情可能吗?如果没有,任何替代方案?我无法使用命令行参数,因为它是一个包含多行的大文本。

2 个答案:

答案 0 :(得分:0)

不,一个进程只有一个标准输入流,一个标准输出流和一个标准错误(输出)流(对于每个进程都是如此,不仅仅是java或php)。

  • 您可以设置一些套接字通信,例如客户端 - 服务器架构,允许多个流,但只有在客户端(php)和服务器(java)都可以执行多线程时才有用。
  • 您可以通过管道发送一些分隔符序列,因此java可以区分三个输入字符串
  • 您可以简单地使用多个proc_open

编辑:

  • 您可以使用文件而不是stdin和stdout(php和java可以共享这些文件)
  • 您可以使用unix管道(类似于套接字解决方案),但这很难实现。

答案 1 :(得分:0)

这取决于您尝试做什么,以及Java应用程序所期望的内容。

如果您希望Java应用程序看到$input$input2$input3的串联,那么确定......您的代码将会这样做。

如果您希望Java能够自动将这些输入看作不同的流,那么没有。就Java IO系统而言,字节只是字节。除了(组合)流的最终结束之外,没有自然界限。

如果您希望Java看到一个流然后可以拆分为三个流,那么它是可能的,但这需要一些编程工作。

  • 在PHP方面,您必须向流中添加某种“框架”信息,告知Java端一个“流”结束并且下一个流开始。

  • 在Java方面,您必须查找/解释该框架信息。

可以通过为每个流发送字节数后跟字节来完成成帧,或者可以使用标记字符或指定流结束的序列来完成成帧。