PHP CLI не использует stderr для вывода ошибок

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

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

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

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

4 ответов


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

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

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

fwrite(STDERR, 'error message');

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

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

$fe = fopen('php://stderr', 'w');
fwrite($fe, 'error message');

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


это необходимо для возврата из PHP realm в среду оболочки, чтобы правильно проанализировать сообщение об ошибке. Вам все равно нужно выйти(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

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

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

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