2013-02-08 13 views
8

In meinem Projekt alle PHP-Fehler abzufangen ich gesetzt habe meine Fehlerbehandlung Mechanismus wie folgt zusammen:Fehler in codeigniter Umgang

  1. I error_reporting() in index.php Datei festgelegt haben, die alles in der php.ini Datei überschreibt
  2. ein Fehler-Handler in system/codeigniter/CodeIgniter.php gesetzt mit set_error_handler - diesen Fehler-Handler, _exception_handler ist in system/codeigniter/Common.php
  3. gefunden Die _exception_handler Funktion ignoriert E_STRICT Fehler, ruft die show_php_error Funktion Von der Ausnahmen Systembibliothek, wenn die Schwere dass durch Ihre error_reporting() Funktion in index.php angegeben wird und protokolliert den Fehler nach, was Sie haben in Ihrer config.php Datei
  4. Der Handler einrichten returns FALSE so nach diesem PHP geht weiter, um den Fehler zu behandeln, aber es würde normalerweise error_reporting Ebene und display_errors Einstellung.

Die Sache, die mich ist rätselhaft ist, dass E_ERROR Fehler d fatale Fehler scheinen nicht gar von _exception_handler gefangen werden wird. Es ist nicht nur, dass show_php_error nicht aufgerufen wird, es sieht so aus, als ob die Funktion gerade nicht für sie aufgerufen wird. Dies ist offensichtlich ein Problem, da es bedeutet, dass sie nicht von show_php_error behandelt oder protokolliert werden. Zum Beispiel, wenn ich absichtlich vertippt $this->load->views('foo'); in einem Controller, wird der Handler nicht aufgerufen.

Jeder Vorschlag über Fehlerbehandlung würde sehr geschätzt werden, danke!

+0

Ich denke, dass es ein Problem mit PHP selbst sein kann, ohne es zu testen. Wenn Sie http://www.php.net/manual/en/function.error-reporting sehen.php # 70126 Sie werden sehen, dass in diesem Fall ein E_ERROR einen ähnlichen Effekt wie E_PARSE verursacht. – David

+0

Welche Umgebung verwenden Sie? – bottleboot

Antwort

4

Jetzt ist dies eine ziemlich große Debatte: Ob Sie die fatalen Fehler abfangen sollten oder nicht. Einige sagen, dass sie FATAL sind, so dass Sie nicht wissen, in welchem ​​Zustand das System ist, aber ich werde mit dem "versuchen, die Bereinigung zu tun, wenn der Fehler aufgetreten ist" gehen. Um alle schwerwiegenden Fehler zu erfassen, müssen Sie einen pre_system-Hook einrichten. gehen auf application/config/hooks.php und geben Sie

$hook['pre_system'][] = array(
'class' => 'PHPFatalError', 
'function' => 'setHandler', 
'filename' => 'PHPFatalError.php', 
'filepath' => 'hooks' 
); 

danach zu Haken Verzeichnis gehen und fügen Sie Ihre Handhabung des Fehlers:

<?php 
    class PHPFatalError { 

    public function setHandler() { 
      register_shutdown_function('handleShutdown'); 
     } 

    } 

    function handleShutdown() { 
     if (($error = error_get_last())) { 
      ob_start(); 
       echo "<pre>"; 
      var_dump($error); 
       echo "</pre>"; 
      $message = ob_get_clean(); 
      sendEmail($message); 
      ob_start(); 
      echo '{"status":"error","message":"Internal application error!"}'; 
      ob_flush(); 
      exit(); 
     } 
    } 

wie Sie sehen können wir die register_shutdown_function zu verwenden Führen Sie eine Funktion aus, die prüft, ob ein Fehler aufgetreten ist und ob sie per E-Mail an den Entwickler gesendet wurde. Dieses Setup funktioniert seit über 2 Jahren einwandfrei in mehreren CI-Projekten, mit denen ich gearbeitet habe.

+0

Hi tix, ich denke, das ist wirklich eine gute Annäherung, aber in meinem Fall hatte ich einen angepassten Ansatz entwickelt, wo ich die register_shutdown_function() in einer Hilfsklasse hatte, um allgemeine Fehler des Projekts zu behandeln ... Vielen Dank – troy

+0

Nun können Sie stapeln Die register_shutdown_function(), aber es gibt keine andere Möglichkeit (soweit ich weiß), dass Sie fatale Fehler außer der Verwendung eines Presystem-Hooks erfassen können. – tix3

0

Ich habe diese Antwort unter einer anderen Frage gefunden (https://stackoverflow.com/a/3675357), und ich denke, es ist auch nützlich für jeden, der diese Frage liest. "Für codeigniter spezifische Fehlerbehandlung, können Sie seine 'Exception' Bibliothek Klasse durch Erstellen My_Exception Klasse in Ihrem Anwendung/Bibliotheken-Ordner überschreiben. Kopieren Sie Originalbibliothek Funktionssignaturen hinein und fügen Sie Ihren Code. Es wird sicherlich funktionieren."