2013-02-08 9 views
8

Nel mio progetto di errore per catturare tutti gli errori PHP che ho impostato la mia errore meccanismo di gestione come segue:manipolazione in codeigniter

  1. ho impostato error_reporting() in index.php di file che sostituisce nulla nel file php.ini
  2. un gestore di errori si trova in system/codeigniter/CodeIgniter.php utilizzando set_error_handler - questo gestore degli errori, _exception_handler, è trova in system/codeigniter/Common.php
  3. Il _exception_handler funzione ignora E_STRICT errori, chiama la show_php_error funzione dalla libreria di sistema eccezioni se la gravità è quella specificata dalla funzione error_reporting() in index.php e registra l'errore in base a tutto ciò che è stato impostato nel config.php file di
  4. Il gestore restituisce FALSE quindi, dopo questo PHP, continua a gestire l'errore ma normalmente corrisponde all'impostazione livello e display_errors.

La cosa che mi è sconcertante è che E_ERROR errori ossia errori fatali non sembrano essere essere stato catturato da _exception_handler a tutti. Non è solo che non viene chiamato il numero show_php_error, sembra proprio che la funzione non venga chiamata per loro. Questo è ovviamente un problema in quanto significa che non vengono gestiti da show_php_error o registrati. Ad esempio se ho intenzionalmente digitato in modo errato lo $this->load->views('foo'); in un controller, il gestore non viene chiamato.

Qualsiasi suggerimento sulla gestione degli errori sarebbe molto apprezzato, grazie!

+0

Penso che potrebbe essere un problema con PHP stesso senza essere in grado di testarlo. Se vedi http://www.php.net/manual/en/function.error-reporting.php # 70126 vedrai che in questo caso, un E_ERROR provoca un effetto simile a quello che farebbe E_PARSE. – David

+0

quale ambiente stai usando? – bottleboot

risposta

4

Ora questo è un dibattito piuttosto grande: Se è necessario rilevare gli errori fatali o meno. Alcuni dicono che sono FATAL in modo da non sapere in quale condizione è il sistema, ma andrò con il "prova a fare la pulizia se si è verificato l'errore". Per catturare TUTTI gli errori fatali è necessario impostare un hook pre_system. andare a application/config/hooks.php ed entrare

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

dopo che andare a directory ganci e aggiungere la vostra gestione dell'errore:

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

come potete vedere stiamo usando il register_shutdown_function a eseguire una funzione che verifica se si è verificato un errore e se è stato inviato via email allo sviluppatore. Questa configurazione funziona perfettamente per oltre 2 anni in diversi progetti CI con i quali ho lavorato.

+0

Hi tix, penso che questo sia davvero un buon approccio, ma nel mio caso ho sviluppato un approccio personalizzato in cui ho avuto il register_shutdown_function() in una classe helper per gestire gli errori complessivi del progetto ... Grazie YOu – troy

+0

Beh, puoi impilare the register_shutdown_function() ma non c'è altro modo (per quanto ne so) che è possibile rilevare errori fatali diversi dall'utilizzo di un hook di presistema. – tix3

0

Ho trovato questa risposta sotto un'altra domanda (https://stackoverflow.com/a/3675357), e penso che sia utile anche per chiunque stia leggendo questa domanda. "Per la gestione degli errori specifici del codice, è possibile sovrascrivere la classe della libreria 'Eccezione' creando la classe My_Exception nella cartella dell'applicazione/librerie, copia le firme delle funzioni della libreria originale e inserisci il codice. Funzionerà sicuramente."