как получить выход из процесса opend по popen в php?

файл a.php:

<?php echo "abcdef"; ?> 

файл b.php:

 <?php $h=popen('php a.php',r); pclose($h); ?> 

вопрос:

Я не вижу результат эха на консоли; почему и как это увидеть?

Я не хочу делать это в файле b.php, например: echo stream_get_contents($h);

Проверьте второй пример в документации по папке , он точно показывает, как это сделать:

 <?php error_reporting(E_ALL); /* Add redirection so we can get stderr. */ $handle = popen('/path/to/executable 2>&1', 'r'); echo "'$handle'; " . gettype($handle) . "\n"; $read = fread($handle, 2096); echo $read; pclose($handle); 

Этот фрагмент читается из stderr. Удалите трубу для чтения из стандартного вывода.

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

Другими словами, поток.

  • b.php начинает работать – его STDIN и STDOPUT связаны с вашей консолью как обычно
  • он вызывает popen в режиме чтения и сохраняет ресурс потока в $ h
  • это заставляет a.php запускаться, а его STDOUT связан с файловым дескриптором в $ h, а его STDIN не привязан ни к чему
  • это означает, как вы видите, что a.php не имеет прямого доступа к консоли, с которой был запущен b.php
  • a.php записывает свой вывод в этот поток, а затем завершает работу
  • b.php никогда ничего не делает с потоком в $ h, он просто закрывает его, поэтому выход a.php теряется.

Надеюсь, это объясняет, что здесь происходит. Если вы хотите увидеть вывод a.php на консоли, тогда b.php нужно прочитать его из потока в $ h, а затем повторить его, так как только b.php имеет доступ к консоли.

В качестве альтернативы, если вы используете system () вместо popen (), вывод будет выводиться на консоль вызывающего скрипта автоматически, потому что использование system () передает STDIN и STOUT основного сценария в вызываемую вами программу или скрипт.