В моем текущем проекте я запрашиваю PHP с обычным HTTP-запросом, но также через AJAX, где я иногда возвращаю данные в формате JSON, а иногда и обычный текст. Когда возникает ошибка, в обычном запросе вы видите сообщение об ошибке и можете что-то сделать. С другой стороны, с AJAX-запросами вы не можете быть уверены, получите ли вы ошибку или данные, потому что они не отображаются напрямую – вы просто сталкиваетесь с проблемами, потому что ваше приложение больше не будет работать.
Поэтому я подумал о системе обработки ошибок. Моя лучшая идея – послать заголовок «Внутренняя ошибка сервера» 500, если произошла ошибка, поэтому в моем JS, когда я отправляю запрос AJAX, я могу просто проверить ошибки таким образом и обработать его.
К сожалению, PHP не отправляет такой заголовок (например, когда у вас есть ошибка синтаксического анализа или что-то в вашем коде идет не так) изначально.
Ты можешь:
a) Скажите PHP, чтобы отправлять заголовки, например, 500, если возникает ошибка? Или
b) Использовать set_error_handler для отправки 500-заголовка, а затем вызвать регулярную обработку ошибок PHP? Или
c) Можете ли вы каким-либо другим способом отправить заголовки ошибок при возникновении ошибки PHP?
Я предпочитаю использовать Исключения для обработки ошибок. Во-первых, вам нужно установить обработчик ошибок с ошибкой (http://php.net/manual/en/class.errorexception.php, пример 1), а затем обернуть свой основной код приложения в блок try-catch и отправить соответствующие заголовки в ловушке. Например:
try { $myApplication->run(); } catch(Exception $e) { // log or otherwise register the error header('HTTP/1.1 500 Internal Server Error'); }
к сожалению, это не работает с так называемыми «фатальными ошибками», для их обработки вам нужно использовать глупые трюки, подобные этому
ob_start(); register_shutdown_function(function() { $p = ob_get_contents(); if(preg_match('~Fatal error~', $p)) header('HTTP/1.0 500 Internal Server Error'); }); ...your code...
С другой стороны, с AJAX-запросами вы не можете быть уверены, получите ли вы ошибку или данные, потому что они не отображаются напрямую – вы просто сталкиваетесь с проблемами, потому что ваше приложение больше не будет работать.
Да, ты можешь.
Ваш обратный вызов success
XHR срабатывает, когда передача данных прошла успешно. Учитывая логическую ошибку на уровне приложения, эти данные могут быть сообщением об ошибке. Ваш обратный вызов success
может и должен анализировать данные, полученные с сервера, и определять, была ли ошибка.
Поэтому я подумал о системе обработки ошибок. Моя лучшая идея – послать заголовок «Внутренняя ошибка сервера» 500, если произошла ошибка, поэтому в моем JS, когда я отправляю запрос AJAX, я могу просто проверить ошибки таким образом и обработать его.
«Внутренняя ошибка сервера» генерируется при наличии внутренней ошибки на вашем веб-сервере. У вас нет внутренней ошибки на вашем веб-сервере; у вас есть логическая ошибка в вашем приложении. Таким образом, вручную ссылаться на такой код состояния является неуместным.
К сожалению, PHP не отправляет такой заголовок (например, когда у вас есть ошибка синтаксического анализа или что-то в вашем коде идет не так) изначально.
По хорошей причине выше. Существуют различные типы ошибок, и ошибка PHP / application не мешает веб-серверу выполнять свою работу. HTTP-запрос по-прежнему преуспевает (он просто не может содержать информацию, на которую вы надеялись).
Подумайте о форме входа. Когда вы пытаетесь войти в Facebook, но случайно введите неверный пароль, вы получаете 500 Internal Server Error? Нет. Вы получаете веб-страницу, правильно доставленную с кодом состояния OK 200, в тексте которого говорится «oops, вы ошиблись в своем пароле».
Выше сказанное, я сейчас отвечу на ваш вопрос.
a) Скажите PHP, чтобы отправлять заголовки, например, 500, если возникает ошибка? Или b) Использовать set_error_handler для отправки 500-заголовка, а затем вызвать регулярную обработку ошибок PHP? Или c) Можете ли вы, каким-либо другим образом скрыть ошибки, когда возникает ошибка PHP?
Во всех вышеперечисленных случаях, когда вы хотите отправить заголовок состояния, да, вы можете сделать это, используя функцию заголовка библиотеки.
header('HTTP/1.1 500 Internal Server Error');
Вы можете написать это в обработчике ошибок или где угодно.
То, что вы не можете сделать, это контролировать, что происходит, когда возникает ошибка синтаксического анализа PHP. Ваше приложение должно будет предположить, что вы протестировали все ваши PHP-скрипты и что они анализируют; это не кажется трудной задачей гарантировать.
Используйте функцию header()
.
header('HTTP/1.1 500 Internal Server Error');
Вы можете использовать функцию header () PHP для установки возвратных разных заголовков.
Действительно, вы должны использовать только ошибки 5xx для неустранимых ошибок сервера – поэтому в set_error_handler вы можете проверить уровень ошибки и при необходимости вернуть 500.
Для ошибок, которые вы можете обработать, вы можете рассмотреть диапазон доступных кодов состояния 4xx или включить массив информации об ошибках в возвращаемом JSON
Используя set_error_handler()
и set_exception_handler()
, вы можете запускать свой собственный код всякий раз, когда возникает ошибка.
Это не приведет к ошибкам запуска PHP и не приведет к ошибкам синтаксического анализа в любом PHP-коде, который анализируется до того, как вы установите обработчик ошибок, но все остальные должны быть обмануты.