2 Stimmen

PHP error_log Leistungsprobleme

Ich habe versucht, eine Klasse für die Fehlerbehandlung zu schreiben, die ich auf Websites verwenden kann und die mich im Falle eines Fehlers per E-Mail benachrichtigen wird. Das Problem ist, wenn ich das Profil der Anwendung, es erstickt auf die error_log-Funktion. Hier ist mein Code (unter Auslassung der Klasse:

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

Können Sie mir helfen, herauszufinden, woran es scheitert?

4voto

fvu Punkte 31678

Per Definition ist das Versenden einer E-Mail eine teure Operation (weil es wahrscheinlich einen SMTP-Server kontaktieren muss), so dass die Zeit, die Sie in error_log verbringen, im Vergleich zu der Zeit, die Sie in anderen Zeilen Ihres Programms verbringen, enorm sein wird, wenn Sie ein Profil Ihres Programms erstellen.

4voto

pishfig Punkte 41

Sie könnten die Fehlerinformationen in der Datenbank speichern und dann ein Cron-Skript verwenden, das Ihnen den Inhalt per E-Mail zusendet. Ich denke, das Speichern in der DB wird für den Benutzer schneller sein als das Senden einer E-Mail.

1voto

sunwukung Punkte 2685

Ich habe dieses Problem endlich gelöst - mein Fehler. Der Versuch, den Error-Handler so einzustellen, dass er auf Mail protokolliert, führt nur dazu, dass das Skript auf einer lokalen Installation tuckert - da es keinen Mail-Server finden kann (nehme ich an). Das Einschließen des Methodenaufrufs in eine Bedingung, die den Standort erkennt, beendet das Problem.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X