Печать на терминал при использовании буферизации вывода в PHP-скриптах CLI - PullRequest
6 голосов
/ 31 августа 2009

Я использую командную строку PHP для создания некоторых файлов в автономном режиме. Для захвата выходных данных скрипта я использую стандартный материал ob_start:

ob_start();
// Echo lots of stuff
$content = ob_get_contents();
// Now the $content can be written to a file

Однако я также хочу напечатать некоторые сообщения на терминал (например, предупреждения) , в то время как собирает «основной вывод» в буфер. Есть ли способ сделать это? Похоже, невозможно приостановить буферирование на некоторое время, чтобы напечатать сообщения терминала, а затем продолжить буферизацию с того места, где оно было оставлено. Есть ли обходной путь для этого?

Ответы [ 3 ]

8 голосов
/ 31 августа 2009

Просто запишите в STDOUT или STDERR (обе константы, содержащие ресурсы указателя файла), используя fputs ():

ob_start();
echo 'Output buffer';
fputs(STDOUT, "Log message");
$x = ob_get_contents();
ob_end_clean();;

echo "X = $x";
6 голосов
/ 31 августа 2009

Используйте поток php://stderr:

$f = fopen('php://stderr', 'w');
fputs($f, 'Output');

РЕДАКТИРОВАНИЕ: Кроме того, в CLI есть предопределенная постоянная STDERR :

fputs(STDERR, 'Output');
2 голосов
/ 31 августа 2009

Возможно «приостановить» выходной буфер. Запишите содержимое буфера в переменную и завершите буфер без очистки. Запишите некоторый небуферизованный вывод и снова вызовите ob_start (). Этот метод использует конкатенацию строк, и это довольно грязный метод. По этой причине я предпочитаю другие методы выше моих.

Но в любом случае вот небольшой рабочий пример:

<?php
ob_start();
    echo 'Buffered line 1.<br>';
$ob = ob_get_contents();
ob_end_clean();

echo 'Non-buffered line.<br>';

ob_start();
    echo 'Buffered line 2.<br>';
$ob .= ob_get_contents();
ob_end_clean();

echo 'Non-buffered line.<br>';

ob_start();
    echo 'Buffered line 3.<br>';
$ob .= ob_get_contents();
ob_end_clean();

echo 'Non-buffered line.<br>';

echo $ob;
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...