proc _open :Расширение номеров файловых дескрипторов для обеспечения обратной связи о статусе из Perl-скрипта

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-скрипте?

Спасибо

6
задан Ricalsin 24 April 2012 в 19:21
поделиться