В руководстве PHP proc_open указано:
Номера файловых дескрипторов не ограничены 0, 1 и 2 — вы можете указать любой допустимый номер файлового дескриптора, и он будет передан дочернему процессу. Это позволяет вашему сценарию взаимодействовать с другими сценариями, которые выполняются как «совместные процессы». В частности, это полезно для более безопасной передачи парольных фраз таким программам, как PGP, GPG и openssl. Это также полезно для чтения информации о состоянии, предоставляемой этими программами для вспомогательных файловых дескрипторов.
Что происходит: я вызываю сценарий Perl в веб-приложении на основе PHP и передаю параметры в вызове. У меня нет в будущем необходимости отправлять данные в скрипт. Через стандартный вывод [1] я получаю от Perl-скрипта json_encoded данные, которые использую в своем PHP-приложении.
Что я хотел бы добавить: Perl-скрипт проходит через веб-сайт, собирая информацию в зависимости от параметров, переданных при его первоначальном вызове. Я хотел бы отправить обратно в приложение PHP текстовую строку, которую я мог бы использовать для отображения в виде индикатора выполнения.
Как я думаю, что я должен это сделать: я ожидаю опроса (каждые 1-2 секунды) канала, который был настроен для этого "прогрессивного" обновления. Я бы использовал Javascript/jQuery для записи в контейнер html div для просмотра пользователем. Я не думаю, что мне следует смешивать канал «прогресс» с более важным каналом «json_encode (данные)», поскольку мне тогда нужно будет расшифровать поток stdout. (Разве эта мысль логична, практична?)
Мой главный вопрос: как вы используете дополнительные "файловые дескрипторы"? Я бы хотел, чтобы настройка дополнительных каналов была простой, например, 3 => ... в приведенном ниже примере:
$tunnels = array(
0 => array('pipe', 'r'),
1 => array('pipe', 'w'),
2 => array('pipe', 'w'),
3 => array('pipe', 'w')
);
$io = array();
$resource = proc_open("perl file/tomy/perl/code.pl $param1 $param2 $param3", $tunnels, $io);
if(!is_resource($resource)) {
$error = "No Resource";
}
fclose($io[0]);
$perlOutput = stream_get_contents($io[1]);
$output = json_decode($perlOutput);
$errors = stream_get_contents($io[2]);
print "$errors<p>";
fclose($io[1]);
fclose($io[2]);
$result = proc_close($resource);
if($result != 0) {
echo "you returned a $result result on proc_close";
}
Но в сценарии Perl я просто пишу в стандартный вывод, например:
my $json_terms = encode_json(\@terms);
print $json_terms;
Если я правильно понимаю настройку дополнительного канала (выше 3 => ...), то как мне писать в него внутри Perl-скрипта?
Спасибо