Проблемы с производительностью PHP error_log - PullRequest
2 голосов
/ 21 октября 2009

Я пытался написать класс обработки ошибок, который я мог бы использовать на сайтах, который напишет мне по электронной почте в случае ошибки. Проблема в том, что когда я профилирую приложение, оно задыхается от функции 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);
    }
}

Можете ли вы помочь мне понять, что его убивает?

Ответы [ 3 ]

4 голосов
/ 22 октября 2009

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

4 голосов
/ 21 октября 2009

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

1 голос
/ 09 ноября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...