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