Буферизация вывода PHP в командной строке

У меня есть PHP-скрипт, который я хочу запустить в командной строке. Этот скрипт, среди прочего, должен загрузить файл PHP, содержащий как PHP, так и HTML-контент, и получить визуализированный вывод из этого файла.

Этот код делает именно то, что мне нужно, но не при запуске из командной строки:

<?php

// ...
if(file_exists($content_file)) {
  ob_start();
  include($content_file);
  $content = ob_get_contents();
  ob_end_clean();
}

?>

При запуске в браузере мой скрипт получает обработанный вывод файла PHP через include() и сохраняет вывод в $content.

Однако, когда я запускаю этот сценарий в командной строке, содержимое файла PHP выводится, а $content никогда не устанавливается.

Я искал документацию, но ничего не работает. Вызов ini_set('implicit_flush', false) не имеет никакого эффекта, равно как и ob_implicit_flush(0);

Есть предположения?


person Erich    schedule 05.04.2011    source источник
comment
Попробуйте подавить ошибки, добавив @ перед включением: @include($content_file);   -  person Raisen    schedule 05.04.2011
comment
@Raisen, здесь нет ошибок, и использование оператора подавления ошибок @ обычно считается плохой практикой.   -  person Charles    schedule 05.04.2011
comment
Можете ли вы включить команду, которую вы используете для вызова скрипта? Я знаю, что это долгий путь, но это может повлиять на ваш результат.   -  person eykanal    schedule 05.04.2011
comment
От отдела маловероятных, но возможных ошибок: попробуйте ob_start(NULL,0), а также убедитесь, что в вашем включаемом файле нет ob_flush().   -  person mario    schedule 05.04.2011


Ответы (1)


Я не могу воспроизвести эту проблему, используя PHP 5.3.

[charles@lobotomy ~]$ cat includeme.php
<?php

echo "Oh hi!\n";
?>
I am an include!

[charles@lobotomy ~]$ cat includehim.php
<?php

$content_file = './includeme.php';

if(file_exists($content_file)) {
  ob_start();
  include($content_file);
  $content = ob_get_contents();
  ob_end_clean();
}
[charles@lobotomy ~]$ php includehim.php
[charles@lobotomy ~]$

И в интерактивной подсказке:

[charles@lobotomy ~]$ php -a
Interactive shell

php > $content_file = './includeme.php';
php > if(file_exists($content_file)) {
php {   ob_start();
php {   include($content_file);
php {   $content = ob_get_contents();
php {   ob_end_clean();
php { }
php >
php > echo $content;
Oh hi!
I am an include!

php > exit;
person Charles    schedule 05.04.2011
comment
У меня точно такая же проблема с использованием PHP5.3 - CakePHP2.0 и Shells, похоже, игнорируют ob_start() и т. Д. Может быть, потому, что оболочка работает на уровне CLI или около того? В моем случае я хочу получить результат system('dos2unix -h', $x); но всегда печатает... - person mark; 05.11.2011
comment
@mark, вы, вероятно, захотите использовать exec или proc_open вместо system. system намеренно портит буфер вывода. - person Charles; 05.11.2011
comment
Спасибо. Я также использовал exec без успеха. странно: exec('svn/git') работает. вывод не сбрасывается, а возвращается правильно. proc_open я никогда не слышал. попробую! - person mark; 05.11.2011