2009-10-21 2 views
1

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

class ErrorHandler 
{ 
private static $instance; 
private static $mail; 
private function __clone(){} 

private function __construct() 
    { 
    error_reporting(E_ALL | E_STRICT); 

    if(!defined('ENV')){ 
     if($_SERVER['SERVER_ADDR']=='127.0.0.1' || $_SERVER['SERVER_NAME']=='localhost') 
      { 
      #echo"local environment<br>"; 
      DEFINE('ENV','LOCAL'); 
      ini_set('display_errors', 1); 
      } 
     else 
      { 
      #echo"live environment"; 
      DEFINE('ENV','LIVE'); 
      ini_set('display_errors', 0); 
      } 
     } 
    } 
public function setErrorConfig($error_level,$mail='',$mode='production') 
    { 
    error_reporting($error_level); 
    switch($mode) 
     { 
     case 'development': 
     ini_set('display_errors', '1'); 
     break; 

     case 'production': 
     ini_set('display_errors', '0'); 
     if($mail != ''){ 
      self::$mail = $mail; 
      set_error_handler(array('ErrorHandler', 'handleError')); 
      } 
     break; 

     default: 
     ini_set('display_errors', '0'); 
     error_reporting(E_ERROR); 
     break; 
     } 
    } 

public function handleError($e_num,$e_msg,$e_file,$e_line,$e_vars) 
    { 
    $headers = 'MIME-Version: 1.0' . "\r\n"; 
    $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; 
    $headers .= 'From: DC_Research Site' . "\r\n"; 

    $msg = ''; 
    $msg .= '<html><head></head><body>'; 
    $msg .= '<STYLE>h2{font-family:verdana;}</STYLE>'; 
    $msg .= '<h2>Error Description:</h2>'; 
    $msg .= '<h2>Script:</h2><p>'.$e_file.'</p>'; 
    $msg .= '<h2>Line:</h2><p>'.$e_line.'</p>'; 
    $msg .= '<h2>Message:</h2><p>'.$e_msg.'</p>'; 
    $msg .= '<h2>Variables:</h2><p>'.$e_vars.'</p>'; 
    $msg .= '</html></body>'; 

    #mail(self::$mail,'Error Report',$msg,$headers); 
    error_log($msg,1,self::$mail,$headers); 
    } 
} 

Можете ли вы помочь мне понять, что это убийство

ответ

0

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

3

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

+0

программа действительно chugs, хотя - я не заметил, что это так забито с использованием обычного почтового сценария – sunwukung

+0

не может ответить на этот вопрос без дополнительной информации из вашей настройки, переписав вещь на ошибки буфера во временном файле (я бы предпочитайте файл в базе данных, как предлагал pishfig, потому что db также может сломаться, и вы можете захотеть получить уведомление об этой проблеме), вероятно, меньше проблем, чем выяснение того, что происходит. – fvu

+0

Не только это. error_log() имеет проблемы. Поворот аналогичного типа регистрации в файл сделал 200% ускорение в моем случае. – mixdev

3

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

+0

Это интересный угол, спасибо - я дам, что вихрь – sunwukung

+0

+1 - Так как это позволило бы (используя дБ) лучше узнать, какие методы фиксируются на долговременные и какие проблемы повторного включения, в то же время устраняя почту/документы NIGHTMARE для отслеживания проблем. Почтовые сообщения блокируются, id'd как спам и т. Д. ... и вы можете пропустить важные/критические письма, и вы можете получить бомбардировку с повторными электронными письмами, которые будут заполнять ваш почтовый ящик с ошибкой loop'd. –