PHP proc _open ручные состояния:
Номера файловых дескрипторов не ограничены 0, 1 и 2 -вы можете указать любой действительный номер файлового дескриптора и он будет передан дочернему процессу. Это позволяет вашему сценарию взаимодействовать с другими сценариями, работающими как «процессы co -». В частности, это полезно для более безопасной передачи парольных фраз таким программам, как PGP, GPG и openssl. Это также полезно для чтения информации о состоянии, предоставляемой этими программами для вспомогательных файловых дескрипторов.
Что происходит:Я вызываю сценарий Perl в веб-приложении на основе PHP -и передаю параметры в вызове. У меня нет в будущем необходимости отправлять данные в скрипт. Через stdout[1] я получаю от Perl-скрипта json_закодированные данные, которые использую в своем PHP-приложении.
Что я хотел бы добавить:Сценарий Perl проходит через веб-сайт, собирая информацию в зависимости от параметров, переданных при его первоначальном вызове.Я хотел бы отправить обратно в приложение PHP текстовую строку, которую я мог бы использовать для отображения в виде индикатора выполнения.
Как, по моему мнению, мне следует это сделать:Я рассчитывал опрашивать (каждые 1 -2 секунды )канал, настроенный для этого "прогрессивного" обновления. Я бы использовал Javascript/jQuery для записи в контейнер html div для просмотра пользователем. Я не думаю, что мне следует смешивать канал «прогресс» с более важным каналом «json _encode (data )», поскольку мне тогда нужно будет расшифровать поток 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";
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;
If мое понимание настройки дополнительного канала правильное (выше, 3 =>... ), тогда как мне записать его в Perl-скрипте?
Спасибо