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

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

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

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

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

Ответ 1

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

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

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

fwrite(STDERR, 'error message');

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

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

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

Ответ 2

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

Ответ 3

Вы также можете использовать 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.

Ответ 4

Это необходимо для возврата из области 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