Может ли 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]);

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


person Caballero    schedule 02.08.2013    source источник


Ответы (2)


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

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

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

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

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

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

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

person Stephen C    schedule 02.08.2013

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

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

РЕДАКТИРОВАТЬ:

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