Уведомление об ошибках в PHP

4ksner

Постоялец
Регистрация
6 Июн 2012
Сообщения
149
Реакции
62
Сегодня случайно обнаружил на сайте страницу которая выдавала ошибку в PHP в следствии чего страница не загружалась совсем. Если бы я не зашел на эту страницу то не узнал бы о ее существовании.

В связи с чем появилось желание, чтобы в случаях возникновения таких ошибок у меня на сайте на почту приходило письмо со ссылкой на страницу и содержанием ошибки. Возможно ли это?


P.S. У меня выделенный сервер, поэтому доступ есть ко всем конфигам.
 
Надо добавить в начало скрипта что-то типа:
PHP:
<?php
function shutdown()
{
  mail('admin@email', 'PHP error', var_export(error_get_last(), 1));
}
register_shutdown_function('shutdown');

//Код ниже отключает вывод ошибок на сайте
@ini_set('error_reporting',0);
@ini_set('display_errors','Off');
@ini_set('html_errors', false);

Хотя ошибки уровня "Parse error" таким образом не отловишь. Здесь уже будет лучше использовать запись ошибок php в заданный файл (в php.ini:(
PHP:
log_errors=On
error_log="c:\php_log\php-errors.log"
и парсинг его по крону.
 
не вводи людей в заблуждение, отлавливаются и вполне успешно и Parse error и Fatal error именно таким способом
Я этот код проверял, прежде чем такие выводы делать, буду только рад, если сможешь проапдейтить код, чтобы не спотыкаться при "Parse error"

php 5.3.9, win 7 x64
 

Вложения

  • reg_shu.zip
    452 байт · Просмотры: 5
Пробовал вставлял код в index.php своей CMS, но логи не писались:
PHP:
ini_set('display_errors', 'Off');
error_reporting(E_ALL & ~E_NOTICE);
 
ini_set('log_errors', 1);
ini_set('error_log', '/home/.../logs/php.err.log');

В php.ini log_errors был включен. Прописал еще error_log но логи настырно не хотят писаться куда мне надо.

Потом нашел эти ошибки в PHP для домена здесь: /var/www/httpd-logs
Минус только в том, что там помимо ошибок PHP полно мелких не нужных ошибок.

Хотелось бы все-таки выдрать PHP ошибки в отдельный файл, и желательно сразу по всем доменам.
 
Я этот код проверял, прежде чем такие выводы делать, буду только рад, если сможешь проапдейтить код, чтобы не спотыкаться при "Parse error"

php 5.3.9, win 7 x64

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

P.S. в твоем обработчике в файлике reg_shu.php ошибка, он не будет сохранять в любом случае.
 
нет прав для записи файла апачу, или юзеру под которым работает вхост
Действительно. Сейчас пишет ошибки в лог.

Что касается этого:
PHP:
function shutdown()
{
  mail('admin@email', 'PHP error', var_export(error_get_last(), 1));
}
register_shutdown_function('shutdown');
В случае ошибки приходит 2 письма:
первое с содержанием массива ошибки:
array (
'type' => 4,
'message' => 'syntax error, unexpected T_ENDIF',
'file' => '/home/www/....(666) : eval()\'d code',
'line' => 666,
)
второе: NULL

Если открыть страницу не содержащей ошибку приходит по три письма с NULL. Этого быть как я понимаю не должно.
К тому же в обоих случаях, записи в лог и отправки письма не пишется referer, а это усложнит поиск ошибки на сайте.
 
Если открыть страницу не содержащей ошибку приходит по три письма с NULL. Этого быть как я понимаю не должно.
К тому же в обоих случаях, записи в лог и отправки письма не пишется referer, а это усложнит поиск ошибки на сайте.

Это не законченный код для продакшена, а намёк в какую сторону копать...
Надо результат error_get_last() получать в переменную и если он не равен null отправлять письмо. В письмо, по вкусу можно добавить данные из $_SERVER, $_GET, $_COOKIE, и т.д. Для просмотра ссылки Войди или Зарегистрируйся
 
Это раздел "Как сделать" и метод достижения необходимого результата подсказали...
Если нужен полностью готовый рабочий код, то здесь два варианта, либо молча ждать пока у кого-то появится желание потратить свое время на написание кода, либо создавать в рекламном разделе тему с префиксом "Работа" и оплачивать труд.
 
Назад
Сверху