2010-12-14 3 views
1

Ich habe alle über das Netz suchen, um zu versuchen und einen Weg finden, um alle Fehler von PHP (5,3)Managing PHP Fehler

Ich habe gelesen, durch die Dokumentation und es sieht aus wie set_error_handler geworfen zu fangen ist, was ich brauche aber es werden keine fatalen/parse Fehler angezeigt. Ich bin nicht sicher, ob das möglich ist ...

Hier ist meine Quelle: https://github.com/tarnfeld/PHP-Error-Handler Fühlen Sie sich frei zu fork/commit wenn Sie bessere Lösungen für all dies wissen.

Vielen Dank im Voraus!

Aktualisiert!

Mit den Antworten unten habe ich eine error handler geschrieben, es kümmert sich um E_ERROR | E_PARSE | E_WARNING | E_NOTICE und wird das Skript beenden, wenn es tödlich ist! :-)

Antwort

4

Zitiert das Handbuch: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, und die meisten E_STRICT:

Folgende Fehlertypen können nicht mit einer benutzerdefinierten Funktion behandelt werden in der Datei ausgelöst, wo set_error_handler() aufgerufen wird.

Dies bedeutet, dass Fatals nicht gefangen und behandelt werden können. Was Sie können tun, ist ein zusätzlicher Handler eingerichtet, um ausgeführt werden, wenn das Skript, z. register_shutdown_function.

Verwenden Sie in diesem Handler error_get_last und überprüfen Sie, ob es ein schwerwiegender Fehler war. Dadurch können Sie die Skriptausführung jedoch nicht fortsetzen. Das Skript wird beendet, aber Sie können jede Bereinigung oder Protokollierung durchführen (normalerweise werden die Fatals trotzdem in der error.log protokolliert) oder was auch immer.

Es gibt eine user-supplied example in the comments below set_error_handler

register_shutdown_function('shutdownFunction'); 
function shutDownFunction() { 
    $error = error_get_last(); 
    if ($error['type'] == 1) { 
     //do your stuff  
    } 
} 

Aber beachten Sie, dass dies nur noch bestimmte zusätzliche Laufzeitfehler fangen.

+0

Sweet: Nie daran gedacht, shutdown_function dafür zu benutzen. – Mchl

0

Nein, es ist nicht möglich, fatale und Parse-Fehler zu erfassen. Analysieren Sie Fehler, weil sie ausgelöst werden, bevor das Skript überhaupt kompiliert wird. Schwerwiegende Fehler, weil sie ... fatal sind (d. H. Skript kann nicht weiter ausgeführt werden, nachdem sie angetroffen wurden)

+0

Das ist ziemlich ärgerlich.Mich von Fehlern auf einer Produktionsstätte auf dem Laufenden zu halten, ist also ziemlich unmöglich! How crappy :( – tarnfeld

+0

Dein Produktionscode sollte niemals Parse-Fehler haben (komm, das ist etwas, was dir eine anständige IDE helfen wird.) Außerdem gibt es Möglichkeiten, fatale Fehler zu vermeiden (zB check if class_exists()) bevor du versuchst Objekte zu instanziieren Diese Klasse) – Mchl

+0

Ja, ich weiß, nicht so sehr die Parse-Fehler, aber ich will nicht, dass die Website nur abstürzt, wenn es zum Beispiel nicht mehr genügend Arbeitsspeicher hat ... Es wäre eine gute Idee, einen schnellen Text an den Benutzer auszugeben – tarnfeld

2

Sie können ein Auge auf . In Ubuntu befindet sich dieser in /var/log/apache2/error_log

0

Wenn Sie fatale Fehler (einschließlich Parse-Fehler) abfangen möchten, ist die beste Lösung, Fehler-Logging in der php.ini-Datei, z.

display_errors = Off 
log_errors = On 
ignore_repeated_errors = Off 
ignore_repeated_source = Off 
2

Sogenannte "fatale Fehler" ist vielleicht der nervigste Bug in PHP. Das Beste, was wir dagegen tun können, ist, "php group" zu überzeugen, diesen Fehler als solchen zu erkennen, indem wir für diese Anfrage abstimmen http://bugs.php.net/bug.php?id=28331.

Solange dies nicht behoben ist, sind wir dazu verdammt, schmutzige Hacks wie Shutdown-Fehlerhandler oder Autoloads zu verwenden.