【问题标题】:PHP error_log performance issuesPHP error_log 性能问题
【发布时间】:2009-10-21 11:04:19
【问题描述】:

我一直在尝试编写一个可以在网站上使用的错误处理类,它会在发生错误时向我发送电子邮件。问题是,当我分析应用程序时,它在 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);
    }
}

你能帮我弄清楚是什么杀死了它吗?

【问题讨论】:

    标签: php class error-handling


    【解决方案1】:

    根据定义,发送邮件是一项昂贵的操作(因为它很可能必须联系 SMTP 服务器),因此当您分析您的程序时,与在程序的其他行中花费的时间相比,在 error_log 中花费的时间将是巨大的。

    【讨论】:

    • 这个程序真的很糟糕——我没有注意到它使用普通邮件脚本会受到如此严重的影响
    • 如果没有更多的设置细节,无法回答这个问题,重写东西以缓冲临时文件中的错误(我更喜欢 pishfig 建议的文件而不是数据库,因为数据库也会中断并且您可能希望收到有关此类问题的通知)可能比弄清楚发生了什么麻烦要少。
    • 不仅如此。 error_log() 本身有问题。在我的例子中,将类似类型的日志记录到文件中可以提高 200% 的速度。
    【解决方案2】:

    您可以将错误信息存储在数据库中,然后让一个 cron 脚本通过电子邮件将内容发送给您。我认为保存到数据库对用户来说比发送电子邮件更快

    【讨论】:

    • +1 - 因为这将允许(使用分贝)更好地确定哪些方法正在长期修复以及哪些问题再次出现,同时消除了跟踪问题的邮件/文书工作噩梦。电子邮件被阻止、被识别为垃圾邮件等......您可能会错过重要/关键的电子邮件,并且您可能会被反复出现的电子邮件轰炸,这些电子邮件将在循环错误时填满您的收件箱。
    【解决方案3】:

    我终于解决了这个问题——我的错。尝试将错误处理程序设置为登录到邮件只会导致脚本在本地设置上运行 - 因为它找不到邮件服务器(我假设)。将方法调用包装在检测位置的条件中可以解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-14
      • 2016-09-05
      • 2011-03-20
      • 2012-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-30
      相关资源
      最近更新 更多