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

Тема в разделе "Как сделать...", создана пользователем 4ksner, 20 мар 2013.

  1. 4ksner

    4ksner Постоялец

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

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


    P.S. У меня выделенный сервер, поэтому доступ есть ко всем конфигам.
     
    Extalionez нравится это.
  2. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.546
    Симпатии:
    1.418
    Надо добавить в начало скрипта что-то типа:
    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"
    и парсинг его по крону.
     
    4ksner и Шумадан нравится это.
  3. stealthdebuger

    stealthdebuger Механик

    Administrator
    Регистр.:
    25 авг 2008
    Сообщения:
    634
    Симпатии:
    1.420
    не вводи людей в заблуждение, отлавливаются и вполне успешно и Parse error и Fatal error именно таким способом
     
  4. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.546
    Симпатии:
    1.418
    Я этот код проверял, прежде чем такие выводы делать, буду только рад, если сможешь проапдейтить код, чтобы не спотыкаться при "Parse error"

    php 5.3.9, win 7 x64
     

    Вложения:

    • reg_shu.zip
      Размер файла:
      452 байт
      Просмотров:
      5
  5. 4ksner

    4ksner Постоялец

    Регистр.:
    6 июн 2012
    Сообщения:
    146
    Симпатии:
    61
    Пробовал вставлял код в 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 ошибки в отдельный файл, и желательно сразу по всем доменам.
     
  6. ne4to

    ne4to Постоялец

    Регистр.:
    16 ноя 2012
    Сообщения:
    107
    Симпатии:
    50
    нет прав для записи файла апачу, или юзеру под которым работает вхост
     
    4ksner нравится это.
  7. stealthdebuger

    stealthdebuger Механик

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

    P.S. в твоем обработчике в файлике reg_shu.php ошибка, он не будет сохранять в любом случае.
     
  8. 4ksner

    4ksner Постоялец

    Регистр.:
    6 июн 2012
    Сообщения:
    146
    Симпатии:
    61
    Действительно. Сейчас пишет ошибки в лог.

    Что касается этого:
    PHP:
    function shutdown()
    {
      
    mail('admin@email''PHP error'var_export(error_get_last(), 1));
    }
    register_shutdown_function('shutdown');
    В случае ошибки приходит 2 письма:
    первое с содержанием массива ошибки:
    второе: NULL

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

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.546
    Симпатии:
    1.418
    Это не законченный код для продакшена, а намёк в какую сторону копать...
    Надо результат error_get_last() получать в переменную и если он не равен null отправлять письмо. В письмо, по вкусу можно добавить данные из $_SERVER, $_GET, $_COOKIE, и т.д. http://www.php.net/manual/ru/language.variables.superglobals.php
     
    4ksner нравится это.
  10. stealthdebuger

    stealthdebuger Механик

    Administrator
    Регистр.:
    25 авг 2008
    Сообщения:
    634
    Симпатии:
    1.420
    Это раздел "Как сделать" и метод достижения необходимого результата подсказали...
    Если нужен полностью готовый рабочий код, то здесь два варианта, либо молча ждать пока у кого-то появится желание потратить свое время на написание кода, либо создавать в рекламном разделе тему с префиксом "Работа" и оплачивать труд.
     
    latteo и 4ksner нравится это.