ErrorReporting
Da Php-faq.org.
error_reporting è la direttiva che imposta il livello di notifica degli errori PHP.
[modifica] Come si usa?
Può essere settata direttamente nel file php.ini (se si ha accesso al server), nel file .htaccess, oppure via codice, usando la funzione ini_set() o la funzione error_reporting(). Se viene settata da codice, il nuovo valore impostato sarà valido solo fino alla fine dello script (oppure fino a nuova modifica).
[modifica] Quante categorie di errori esistono in PHP?
Esistono principalmente quattro categorie di errori in PHP.
- E_ERROR. Gli errori fatali, che interrompono l'esecuzione dello script perché per la loro natura non è possibile continuarla.
- E_WARNING. I warning, che non interrompono l'esecuzione dello script, ma che possono compromettere il suo funzionamento e quindi possono comportare perfino una perdita di dati.
- E_NOTICE. I notice, che non interrompono l'esecuzione dello script, che possono comunque compromettere il suo funzionamento, ma possono anche essere innocui.
- E_STRICT. Le imperfezioni, che non interrompono l'esecuzione dello script, ma che sono di grande aiuto se si vuole imparare a programmare come si deve, evitando, ad esempio, di usare funzioni ormai deprecate e che un giorno potrebbero non esistere più nel linguaggio.
Esistono altre categorie di errori (per una lista completa, fare riferimento al manuale) e la costante E_ALL li comprende tutti in PHP6 (fino a PHP5, E_ALL comprende tutte le categorie di errori eccetto E_STRICT).
[modifica] Com'è impostato di default?
Di norma, in PHP6 è impostato a E_ALL, mentre in PHP4 e PHP5 è impostato a E_ALL & ~E_NOTICE.
Chi non conosce gli operatori binari e in generale le bitmask, sappia che può vedere la '&' come ad un 'AND' ('e') e la '~' come ad un 'NOT' ('non').
Quindi di norma in PHP4 e PHP5 vengono segnalati tutti gli errori eccetto le imperfezioni (E_ALL non contiene E_STRICT), e vengono poi esclusi i notice (E_NOTICE).
[modifica] Come impostarlo in fase di sviluppo?
In fase di sviluppo, il consiglio è quello di impostare l'error_reporting a E_ALL se si usa PHP6. Se si usa una versione inferiore di PHP, il consiglio è quello di impostarlo a E_ALL | E_STRICT.
Dunque, se si ha accesso al file php.ini, si può impostare la direttiva in questo modo:
error_reporting = E_ALL | E_STRICT
Se invece non si ha accesso al file php.ini, si può inserire, prima dell'esecuzione della prima istruzione PHP, la seguente linea di codice:
ini_set ('error_reporting', E_ALL ); // PHP6
ini_set ('error_reporting', E_ALL | E_STRICT); // PHP4 e PHP5
In alternativa, è presente la funzione php.net/error_reporting, e quindi il codice diventa:
error_reporting (E_ALL); // PHP6 error_reporting (E_ALL | E_STRICT); // PHP4 e PHP5
[modifica] Come impostarlo in fase di produzione?
Per la fase di produzione, è consigliabile disabilitare la visualizzazione degli errori, mantenendo però un elevato livello di logging.
Impostando le direttive display_errors e display_startup_errors ad off è possibile disabilitare la visualizzazione degli errori. Impostando la direttiva log_errors ad on, invece, gli errori verranno loggati (nel file error.log, se non è stata impostata la direttiva error_log). Di norma, gli errori vengono già anche loggati.
Da notare è anche il fatto che in produzione l'error reporting è bene che sia settato direttamente nel file di configurazione di php, poiché in caso di errori fatali qualsiasi modifica al settaggio negli script non viene apportata con successo.
[modifica] Come lo imposto tramite il file .htaccess?
In questo caso, sarà necessario utilizzare il valore numerico al posto delle costanti. Essendo per alcune costanti (ad es. E_ALL) tale valore numerico variabile nel tempo (ad es. perché vengono aggiunte nuove costanti), bisogna utilizzare la funzione get_defined_constants() per conoscere il valore numerico delle costanti usate sul server. Questa è la lista più aggiornata (PHP6):
[E_ERROR] => 1 [E_WARNING] => 2 [E_PARSE] => 4 [E_NOTICE] => 8 [E_CORE_ERROR] => 16 [E_CORE_WARNING] => 32 [E_COMPILE_ERROR] => 64 [E_COMPILE_WARNING] => 128 [E_USER_ERROR] => 256 [E_USER_WARNING] => 512 [E_USER_NOTICE] => 1024 [E_STRICT] => 2048 [E_RECOVERABLE_ERROR] => 4096 [E_ALL] => 8191
Il valore numerico può essere usato anche nel php.ini, con ini_set() o con error_reporting().
[modifica] Come posso visualizzare tutte le categorie di errori?
Per esser sempre certi di poter vedere tutti gli errori, e quindi di produrre codice migliore, il consiglio, anche in prospettiva futura, è di impostarlo al valore intero più alto possibile, in questo modo:
error_reporting (2147483647); // in case of 32 bit architectures
In questo modo, saremo sicuri che tutti gli errori saranno visualizzati, e anche se ciò comporterà più tempo per correggere il nostro codice, ci darà senza dubbio un codice scritto meglio e quindi più robusto in fase di produzione.
[modifica] Come posso scoprire quale error reporting è in uso in un dato momento?
Tramite la stessa funzione error_reporting() è possibile ottenere il valore corrente in uso senza modificarlo (a patto che non gli siano passati valori, nemmeno uno `0`).
echo $err_rep = error_reporting();
Se si vuole anche visualizzare un qualcosa di più leggibile, un codice come questo può risultare utile (con le dovute modifiche nel tempo):
$err_rep = error_reporting();
$err_list = array(
'E_ERROR', 'E_WARNING', 'E_PARSE', 'E_NOTICE',
'E_CORE_ERROR', 'E_CORE_WARNING', 'E_COMPILE_ERROR', 'E_COMPILE_WARNING',
'E_USER_ERROR', 'E_USER_WARNING',
'E_USER_NOTICE', 'E_STRICT', 'E_RECOVERABLE_ERROR');
for ($i = 0; $i <= count($err_list) - 1; $i++)
{
if ($err_rep & (1 << $i)) {
echo "{$err_list[$i]} \n";
}
}
