PHP CLI не использует stderr для вывода ошибок - PullRequest
13 голосов
/ 23 июня 2011

Я запускаю PHP CLI через NSTask в MacOS, но этот вопрос больше касается самого CLI.

Я слушаю канал stderr, но там ничего не выводится, неважнокакой файл я пытаюсь запустить:

  • Если тип файла не простой текст, stdout устанавливается на ?.
  • Если файл представляет собой php-скрипт с ошибками, сообщения об ошибках по-прежнему выводятся на stdout.

Есть ли переключатель к интерпретатору для обработки ошибок через stderr?У меня есть возможность обнаружить ошибки, отличные от разбора stdout?

Ответы [ 4 ]

19 голосов
/ 23 июня 2011

Директива display_errors (может быть установлена ​​везде) дополнительно принимает параметр "stderr", чтобы сообщать об ошибках в stderr вместо stdout или полностью отключен вывод ошибок.Цитирование из записи PHP вручную:

Значение "stderr" отправляет ошибки в stderr вместо stdout .Значение доступно с PHP 5.2.4.

В качестве альтернативы, если вы используете интерфейс командной строки и хотите выводить собственные ошибки, вы можете повторно использовать потоки командной строки nput / output :

fwrite(STDERR, 'error message');

Здесь STDERR - это уже открытый поток для stderr .

В качестве альтернативы, если вы хотите сделать это только для этого сценария, а не в CLI, вы можете открыть полеобработчик к php://stderr и напишите туда сообщения об ошибках.

$fe = fopen('php://stderr', 'w');
fwrite($fe, 'error message');
9 голосов
/ 23 июня 2011

Если вы хотите, чтобы сообщения об ошибках, отправляемые интерпретатором php, отправлялись на stderr -пайп, вы должны установить display_errors на stderr

2 голосов
/ 16 июня 2016

Это необходимо для возврата из области PHP в оболочку, чтобы правильно проанализировать сообщение об ошибке.Вам все еще нужно выйти (1) или любым другим целым числом, чтобы вернуть код состояния выхода из PHP в оболочку.

fwrite(STDERR, 'error message'); //output message into 2> buffer
exit(0x0a); //return error status code to shell 

Тогда ваша запись в crontab будет выглядеть следующим образом:

30 3 * * * /usr/bin/php /full/path/to/phpFile.php >> /logdir/fullpath/journal.log 2>> /logdir/fullpath/error_journal.log
1 голос
/ 24 мая 2013

Вы также можете использовать file_put_contents () с "php: // stderr" для вывода на стандартную ошибку, например:

php -r 'file_put_contents("php://stderr", "Hiya, PHP!\n"); echo "Bye!\n";' 1>/dev/null

Какие выходные данныеПривет, PHP! \ N "к стандартной ошибке и ничего к стандартному выводу при выполнении в оболочке Bash.

...