0

我在 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]);

那么这样的事情可能吗?如果没有,还有其他选择吗?我不能使用命令行参数,因为它是一个多行的大文本。

4

2 回答 2

0

这取决于您要做什么,以及 java 应用程序期望什么。

如果您希望 Java 应用程序看到 和 的串联,$input那么当然……您的代码会这样做。$input2$input3

如果您希望 Java 能够自动将这些输入视为不同的流,那么不。就 Java IO 系统而言,字节只是字节。没有自然边界……除了(组合)流的最终端。

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

  • 在 PHP 端,您必须向流中添加某种“框架”信息,告诉 Java 端一个“流”在哪里结束,下一个“流”在哪里开始。

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

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

于 2013-08-02T10:19:07.333 回答
0

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

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

编辑:

  • 您可以使用文件而不是标准输入和标准输出(php 和 java 可以共享这些)
  • 您可以使用 unix 管道(类似于套接字解决方案),但这很难实现。
于 2013-08-02T10:03:34.960 回答