2013-08-02 1 views
0

Я использую proc_open в php для вызова приложения java, отправляю ему большой текст для обработки и получения возвращенного результата. Возможно ли передать несколько текстовых строк (входных потоков) вместо одного?Может ли proc_open (php => 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]); 

Так что это что-то вроде этого возможно вообще? Если нет, то какие-то альтернативы? Я не могу использовать параметры командной строки, потому что это большой текст с несколькими строками.

ответ

0

Это зависит от того, что вы пытаетесь сделать, и чего ожидает приложение Java.

Если вы хотите, чтобы приложение Java увидело конкатенацию $input, $input2 и $input3, тогда обязательно ... ваш код сделает это.

Если вы хотите, чтобы Java могла автоматически видеть эти входы в виде отдельных потоков, то нет. Что касается системы Java IO, байты - это просто байты. Естественных границ нет ... кроме конечного конца (комбинированного) потока.

Если вы хотите, чтобы Java увидела один поток, который затем можно разделить на три потока, тогда это возможно, но для этого потребуется некоторое усилие программирования.

  • На стороне PHP, вы должны добавить своего рода «обрамление» информации в поток, который говорит на стороне Java, где один «поток» заканчивается и начинается следующий.

  • На стороне Java вы должны искать/интерпретировать эту информацию кадрирования.

Обрамление может быть сделано путем отправки количество байт для каждого потока, за которым следуют байты, или это может быть сделано с маркерных символов или последовательностей, которые обозначают конец потока.

0

Нет, процесс имеет только один стандартный поток ввода, а также один стандартный выходной поток и единственный стандартный поток ошибок (выход) (это верно для каждого процесса, а не только для java или php).

  • Вы можете настроить связь сокетов, например. архитектура клиент-сервер, которая позволит использовать несколько потоков, но будет помогать только в том случае, если и клиентский (php), и сервер (java) могут выполнять многопоточность.
  • Вы можете отправить через трубу некоторую последовательность разделителей, поэтому Java можно различать три входные строки
  • Вы можете просто использовать более одного proc_open

EDIT:

  • Вы можете использовать файлы вместо stdin и stdout (php и java могут делиться ими)
  • Вы можете использовать unix-каналы (аналогично решению сокета), но это довольно сложно реализовать.