Здравствуйте пытливые умы.
В данном вопросе я хотел бы продолжить
популярную тему вопросов с обработками ошибок в PHP.
Условия.
1) Есть, код.
2) В одном из подключаемых файлах, допустим в одном из модулей закралась ошибка E_ERROR (допустим исключение или несовместимость кода под разные ОС, настройки серверов) или E_PARSE (случайно напортачил программист, и залил на сервер без теста, опаздывал к девушке например).
3) В случае рабочего сервера, где вывод ошибок отключен на соответствующей странице где ситуация случилось — выдает пустоту.
Ниже приведу свои разработки на этот счет
Если вы заинтересовались условиями, то прошу под храбракат, тут еще интереснее.
Почему я привел 2 примера зная, что сущесвтуют
set_exception_handler и
set_error_handler?
Потому что в первый случай хотелось бы свести к унивесальному способу, а второй вариант не обрабатывает ошибки например E_PARSE, E_ERROR, он вообще тупо не запускает функцию перехвата. Хотелось убить 2 зайца одним разом.
Задача.
Отдать заголовки 404, в случае критических ошибок кода + некоторые данные, пускай даже статические вроде «ой, ошибка, сейчас мы это активно исправляем, заходите позже» (пояснения для пользователей).
Зачем?
Потому что поиковик должен на них напираться на 404, а не включать в индекс пустые страницы c 200 Ok + пользователю надо сообщить, что сейчас на сайте есть ошибка. В логи так или иначе это писаться будет, но не всегда в логи заглядываешь, если с виду все хорошо, ну и в меил тоже — мы же ушли к девушкам.
Решение с заголовками
<?php
header($_SERVER[«SERVER_PROTOCOL»].' '.'404'); // выставление заголовков перед генерацией контента
// Генерация контента, возможны ошибки работы кода, исключения, либо ошибки парса.
$data = generate();
header($_SERVER[«SERVER_PROTOCOL»].' '.'200'); // выставление правильных заголовков
// вывод данных к примеру, но лучше через
буферизированный вывод
echo $data;
?>
Предположительное решение проблемы
- Мало, вот пытаюсь найти что-то вроде перехвата кодов ошибок на уровне Apache, но это жутко не универсально и привязывает к одному типу сервера. Более того я пока так и не нашел ни одного примера, как из PHP можно отправить Apache сообщение «Хьюстон у нас проблемы!», что бы тот загрузил дефолтную страницу ошибки.
- Через программный способ, то сейчас изучаю фунции буферизации вывода, может быть что дать сможет.
- Немного не представляю других способов, если конечно в PHP нет чего-нибуть этогкого, за это я возьмусь после первых 2-х пунктов.
- Есть вариант записать в вывод данные (как описано выше в Решение с заголовками), далее сбросить их и заново переписать с нуля с новыми заголовками — но это очень костыльно.
На все приведенное выше я
не знаю решений, это только предположения.
Ссылки на материал на текущий момент
httpd.apache.org/docs/2.0/mod/core.html#errordocument
www.php.net/manual/ru/ref.outcontrol.php
php.net/manual/ru/function.set-error-handler.php
php.net/manual/ru/function.set-exception-handler.php
www.php.net/manual/ru/index.php
Господа, ваши предложения и главное решения с пруфлинками в студию
UPD:
Удивляюсь хомячкам, которые за
редчайшие и тонкие вопросы минусуют карму, научитесь сами кодить для начала без костылей.
UPD2:
— В данном вопросе есть 2 ответа и все интересные, решение является наиболее элегантным, но второе решение тоже интересно.
— Тем кому опять-таки надо зарегистрировать метод класса прошу
сюда, там я описал, как это делается.
UPD3:
В процессе разборов полетов, появилась дискуссия, которую советую прочитать для общего развития.