Источники: https://perishablepress.com/advanced-php-error-handling-via-htaccess/ и https://perishablepress.com/how-to-enable-php-error-logging-via-htaccess/

В этом уроке мы научимся такой вещи как сокрытие ошибок PHP. Попутно мы также разберём, как не просто подавлять вывод этих ошибок, но и как записывать их в файл журнала, как защитить этот файл журнала, как настроить уровень сообщения об ошибках PHP (насколько серьёзные ошибки показывать, показывать ли предупреждения), научимся устанавливать максимальный размер строки ошибки и отключим запись повторяющихся ошибок.

Нужно ли прятать PHP ошибки

PHP ошибки выдают самую разнообразную информацию, которая позволяет нападающим собрать данные о вашем сайте и вашем сервере. Но если бы на этот вопрос был однозначный ответ «да», то всё решалось бы добавлением в каждый файл с программами PHP одной единственной строки

На самом деле, все ошибки, в том числе и предупреждения (некритические ошибки) нужно выводить на стадии тестирования. Вывод ошибок и предупреждения также поможет разобраться в имеющихся (или возможных) проблемах в рабочем окружении. Не стоит подавлять вывод ошибок и предупреждений в программах, предназначенных для свободного распространения, поскольку при возникновении проблем все репорты пользователей о проблемах будут одинаковыми: «там белый экран», что сильно затруднит попытки разобраться.

В общем, на серверах, предназначенных для разработки (например, на домашнем сервере), не нужно убирать ошибки и предупреждения PHP методами error_reporting(0); и @ — нужно изучить их причины и исправлять исходный код.

На рабочих серверах крайне рекомендуется не показывать всем ошибки, которые возникли в PHP коде, но рекомендуется не просто подавлять их показ, но ещё и вести их лог, записывать для системного администратора и для программиста на PHP — из этих логов они получат важную информацию о возможных проблемах на сайте/сервере.

Как включить журналирование ошибок PHP посредством .htaccess

В этой части урока я покажу пользователям Apache как подавить вывод ошибок PHP и скрыть их от посетителей, при этом будет включена запись PHP ошибок для их дальнейшего анализа, вся эта настройка будет осуществлена через файл .htaccess.

Вообще, этот способ обладает ещё одним замечательным плюсом — вместо того, чтобы пытаться переловить все PHP ошибки и предупреждения, мы каждое из них будем записывать в наш личный лог, благодаря этому не ускользнёт ни одна возникшая ошибка, даже если она возникла не у вас, а у кого-то посетителя вашего сайта при условиях которые, может быть, вам бы даже и в голову не пришли для моделирования. Благодаря магической мощи файла .htaccess есть простой способ реализовать эту эффективную стратегию.

Прячем PHP ошибки от посетителей

Есть разные способы подавить ошибки PHP посредством .htaccess. Это можно сделать включением следующих директив .htaccess в файл вашего домена httpd.conf или в корневую (или любую другую целевую директорию) файла .htaccess со следующим содержимым:

Это приведёт к тому, что PHP ошибки больше не будут публичными на вашем сайте. Это исключает потенциальные риски безопасности, и не даёт этим уродским, непонятным PHP ошибках поломать вёрстку вашего сайта и дезориентировать ваших посетителей. Редактирования кода для этого не требуется.

Включение личного журнала PHP ошибок

Теперь, когда мы спрятали PHP ошибки от общественности, давайте включим их журналирование (запись), чтобы мы могли их отследить. Это делается добавлением следующих директив .htaccess к файлу вашего домена httpd.conf или в ваш файл .htaccess, который размещён в корневой (или любой целевой) директории.

Чтобы это заработало, вам нужно отредактировать путь в последней строчке в соответствии с действительным расположением вашего файла PHP_errors.log. Конечно, вместе с этим вам нужно создать этот файл и дать ему разрешения 755 или, если необходимо, 777. Наконец, вам нужно обезопасить этот файл журнала, добавив эти завершающие строки кода в ваш файл .htaccess:

Теперь, когда всё на месте, проверьте, что всё работает как следует, вызовите несколько ошибок PHP. Вы также, возможно, захотите проверить защиту вашего файла журнала, попробовав получить к нему доступ через браузер.

Продвинутая обработка ошибок PHP с помощью .htaccess

Давайте теперь глубже окунёмся в эту тему, добавим дополнительной функциональности и исследуем различные реализации. В первую очередь мы исследуем работу с ошибками PHP для рабочего окружения (например, для веб-сайтов и приложений, которые находятся онлайн, активны и являются публичными), затем мы рассмотрим работу с ошибками для окружения разработчика (например, для проектов под разработкой, тестирования, частных, т. д.).

Контролирование уровня сообщения ошибок PHP

Используя .htaccess возможно настроить уровень сообщения ошибок, который подходит под ваши практические нужды. Общий форт для контролирования уровня ошибок PHP следующий:

Есть несколько распространённых значений, которые можно подставить вместо «цифра», в том числе:

  • Самое полное сообщение об ошибках (соответствует E_ALL) — для этого используйте значение «32767».
  • Полное сообщение об ошибках — для полной записи ошибок PHP используйте величину «8191», которая включит запись всего, кроме уведомлений времени выполнения об использовании устаревших конструкций (предупреждения о коде, который не будет работать в следующих версиях PHP).
  • Сообщение об ошибках Zend — для записи как фатальных, так и не фатальных предупреждениях времени компиляции, генерируемых скриптовым движком Zend, используйте «192».
  • Сообщение о базовых ошибках — записывать уведомления времени выполнения. Указывают на то, что во время выполнения скрипта произошло что-то, что может указывать на ошибку, хотя это может происходить и при обычном выполнении программы. Для этого используйте цифру «8».
  • Минимальное сообщение об ошибках — записывать только фатальные ошибки времени выполнения. Это неустранимые средствами самого скрипта ошибки, такие как ошибка распределения памяти и т.п. Выполнение скрипта в таком случае прекращается. Для этого используйте цифру «1».

Конечно можно использовать и другие значения («цифры») для тонкой настройки того, какие именно ошибки вы хотите фиксировать. Некоторые разъяснения по данному вопросу в самом низу.

Настраиваем максимальный размер файла для записей ваших ошибок

Используя .htaccess вы можете определить максимальный размер для ваших ошибок PHP. Имеется ввиду контроль размера каждой записанной ошибки, а не всего файла в целом. Синтаксис имеет следующий вид:

Здесь «целове_число» представляет максимальный размер каждой записанной строки ошибки в байтах. По умолчанию значение равно «1024» (т. е. 1 килобайт). Чтобы удалить этот лимит можно установить значение «0». Помните, .что это значение также применяется для отображаемых ошибок, когда они включены (например, во время разработки).

Отключение записи повторяющихся ошибок

Если вы уже успели поработать с журналом ошибок, вы могли обратить внимание, что в нём множество похожих записей, которые различаются только временем события. От этой избыточности можно избавиться, просто добавьте в файл htaccess эти строки:

При таких настройках повторяющиеся ошибки не будут записываться в ружнал, даже если они случились в различных источниках или адресах. Если вы хотите отключить повторяющиеся ошибки только из одного источника или файла, просто закомментируйте или удалите последнюю строку. И наоборот, чтобы убедиться, что ваш файл журнала событий включает все повторяющиеся ошибки, измените обе величины с on на off.

Собираем всё вместе — рабочее окружение

Обсудив особенности настройки записи ошибок PHP, давайте соберём все наши записи в один файл .htaccess. Данные настройки оптимизированы для рабочего окружения.

Если вы считаете хорошим стилем код с пояснениями, то этот же код, но с комментариями:

Приведённая стратегия идеальна для публичного сервера в рабочем окружении. Все ошибки скрыты от посторонних глаз, при этом они аккуратно собираются для администраторов и программистов. Конечно, вы можете настроить приведённые директивы под себя, чтобы они идеально подходили под ваши задачи. А теперь давайте рассмотрим стратегию работы с ошибками для окружения разработки.

Собираем всё вместе — окружение разработки

Разрабатывая или отлаживая программу, удобнее отслеживать возникающие PHP ошибки в режиме реального времени, прямо в браузере. Пример .htaccess с соответствующими настройками под окружение разработки приведён ниже:

Не будем объяснять каждую строку — вы можете посмотреть соответствующие разъяснения чуть повыше.

Подсказки

Чтобы узнать абсолютный путь до лог файла на сервере методами PHP (для директивы php_value error_log)

Пример .htaccess для сервера на Widnows, установленного по этой инструкции.

Не работает

Этот способ не применим на хостингах, где PHP работает как CGI (возможные пути решения будут показаны в следующей статье).

-1 и ~0 для отображения всех ошибок PHP

В директиве php_value error_reporting для отображения всех ошибок можно указать -1 или ~0. Т.е. строки выглядят так:

Причём более правильным считается именно второй способ, т. е. с использованием ~0.

Предопределенные константы и побитовые операции error_reporting

Для ознакомления рекомендуются следующие страницы справки PHP

Например, если мы хотим записывать ТОЛЬКО следующие ошибки E_ERROR (значение 1), E_WARNING (значение 2), E_CORE_ERROR (значение 16), то для получения соответствующейо числовой величины   следовало бы перевести эти величины в двоичные числа и произвести соответствующие побитовые операции, а потом полученное двоичное число перевести в десятеричное. Тем не менее, эту операцию можно упростить — достаточно сложить значения десятеричных чисел. Т.е. в нашем случае это 1+2+16=19

будет отображать ошибки E_ERROR, E_WARNING и E_CORE_ERROR.

Пример абсолютного пути до лог файла на хостинге Hostland (для директивы php_value error_log)

Вместо host900456 нужно указать ваш аккаунт.

Вместо codeby.net нужно указать ваш домен.


Кстати, хороший хостинг, на котором работает этот самый сайт. Рекомендуем!

Похожие темы

Установка Apache, PHP, MySQL, phpMyAdmin Всё будет хорошо Митя Фомин Теперь доступна инструкция "Установка и настройка сервера Apache, PHP, MySQL, phpMyAdmin на Windows 10". Она заменяет ...
Решение ошибки dpkg: warning: ‘ldconfig̵... Источник: http://www.blackmoreops.com/2015/08/15/fixing-dpkg-warning-ldconfig-not-found-in-path-or-not-executable-error-when-installing-packages/ ...
Обновление сервера Apache и его компонентов... Вот здесь я рассказывал, как установить локальный сервер Apache. Со временем выходят новые версии программ, и возникает необходимость обновления. Проц...
Новости софта от 1 сентября 2014 года (PHP, phpMyA... Самая главная новость — это мажорное обновление PHP 5.6.0. Теперь ветка 5.6 считается стабильной и рекомендованной для «продакшана»...
Решение проблемы с ошибкой Pyrit: IOError: libpcap... При использовании программы Pyrit иногда возникают ошибки. Например, у меня набралось несколько особенных рукопожатий. И при любых командах, связанн...