Frage

Ich habe versucht, eine Fehlerbehandlungsklasse zu schreiben, die ich auf Websites verwenden kann, die mir im Falle eines Fehlers eine E -Mail senden. Das Problem ist, wenn ich die Anwendung profiliere, wird es in der Funktion "ERROR_LOG" erstickt. Hier ist mein Code (die Klasse weglassen:

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);
    }
}

Kannst du mir helfen, herauszufinden, was es tötet?

War es hilfreich?

Lösung 3

Ich habe dieses Problem endlich gelöst - mein schlechtes. Der Versuch, den Fehlerhandler so einzustellen, dass er sich an einen Versand mailen, führt nur dazu, dass das Skript ein lokales Setup tuckert - da es keinen Mailserver finden kann (ich nehme an). Wenn Sie den Methodenaufruf in eine Bedingung einwickeln, die den Standort erfasst, stoppt das Problem.

Andere Tipps

Per Definition ist das Senden einer E -Mail eine teure Operation (da sie sich sehr wahrscheinlich an einen SMTP -Server wenden muss). Wenn Sie also Ihr Programm profilieren, ist die in errorhalte Zeit aufgewendete Zeit enorm im Vergleich zu Zeit, die in anderen Zeilen Ihres Programms aufgewendet wird.

Sie können die Fehlerinformationen in der Datenbank speichern und anschließend eine Cron -Skript -Senden Sie Ihnen den Inhalt per E -Mail. Ich denke, das Speichern bei der DB ist für den Benutzer schneller als das Senden einer E -Mail

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top