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.