Modificare la visualizzazione degli errori in PHP

Giovanni Canella

03/09/2013

5356

In PHP la visualizzazione degli errori per default è impostata per mostrare solo i messaggi che compromettono l'esecuzione dello script: per intenderci, quando viene mostrato Fatal error

Questo aspetto è fondamentale durante il debug per correggere i problemi in cui (per forza!) incapperemo durante la stesura del codice, infatti PHP ci mostrerà tutte le informazioni di cui abbiamo bisogno per individuare e risolvere l'errore:

  • Linea incriminata,
  • Messaggio,
  • Tipo di errore.

Funzione utile, ma dipende anche dal contesto: in ambito produttivo è assolutamente da evitare mostrare tutte queste "succulente" informazioni per un eventuale malintenzionato, che potrebbe riutilizzarle a nostro danno per scoprire eventuali falle nel nostro sistema. Proprio per questo motivo nel seguente articolo vedremo come gestire al meglio la visualizzazione degli errori in PHP, a seconda dell'ambito.

Gestione degli errori con PHP

Tutti i tipi di errore

PHP ci mette a disposizione un bel numero di livelli di errore, rappresentati da varie costanti, ecco le principali

  • E_ERROR: Errore importante che compromette la corretta esecuzione dello script, generato di solito da chiamate di funzioni inesistenti, problemi di allocazione della memoria ecc.
  • E_WARNING: Errore, che ci avverte di un problema che può incidere sull'esecuzione dello script, come ad esempio quando si prova ad aprire un file inesistente. Non blocca la sua esecuzione.
  • E_PARSE: Segnala errori riguardo il parser PHP, per esempio quando omettiamo una parentesi alla fine di un blocco, o qualunche altro termine che rappresenti espressioni malformate. Blocca l'esecuzione dello script.
  • E_NOTICE: Avvisi per informarci di eventuali espressioni che potrebbero generare errori inaspettati, per esempio quando assegnamo un valore a una variabile non inzializzata, oppure accediamo a un indice di un array inesistente. Questi errori anche se di basso livello, andrebbero considerati maggiormente perchè sono molto utili per scovare qualche bug e migliorare la stabilità dell'applicazione.
  • E_STRICT: Ci avverte dandoci dei "consigli" su come rendere la nostra applicazione maggiormente compatibile con le precedenti e future versioni di PHP, per esempio quando chiamiamo un metodo in modo statico anche se non lo è.
  • E_DEPRECATED: Avviso per dirci che la particolare procedura che stiamo utilizzando è stata deprecata, e di conseguenza non potrebbe più funzionare con le future versioni di PHP; per esempio se utilizziamo le vecchie funzioni mysql_*. (vedi articolo su come rimpiazzarle con PDO).
  • E_ALL: Mostra tutti i livelli di errore mostrati precedentemente, compreso anche E_STRICT dalla versione 5.4.0 di PHP.
  • -1: Equivalente a E_ALL.

In ogni caso sono disponibili tutte nella documentazione ufficiale.

Gestione

Per utilizzare questi livelli di errore, abbiamo 3 possibilità:

  1. File di configurazione .ini,
  2. .htaccess,
  3. Configurazione "al volo".

Io personalmente consiglio l'ultima opzione, per permette all'applicazione di funzionare anche quando non è utilizzabile il file .htaccess, o non abbiamo molta famigliarità con i file .ini. Quindi utilizziamo la funzione error_reporting(), passandogli come parametro il livello di errore che vogliamo mostrare, in questo modo:

error_reporting(E_ERROR);

Possiamo anche concatenare questi parametri fra di loro, ottenendo diverse combinazioni, tramite l'operatore booleano OR, rappresentato in PHP dal segno "|":

error_reporting(E_ERROR | E_WARNING);

Mentre per disabilitarli passiamo come parametro 0:

error_reporting(0);

Durante il debug consiglio vivamente di utilizzare E_ALL.

Ecco una configurazione completa in fase di testing:

error_reporting(E_ALL);  
ini_set("display_errors", 1);  
ini_set("display_startup_errors", 1); 
ini_set("track_errors", 1);   
ini_set("log_errors", 1);  
ini_set("error_log", "/logz.txt");  
ini_set("log_errors_max_len", 0);  

 

E questo una volta messo online il sito:

error_reporting(0);  
ini_set("display_errors", 0);  
ini_set("display_startup_errors", 0); 
ini_set("track_errors", 0);   
ini_set("log_errors", 0);  

Note e informazioni

Dobbiamo però stare attenti a un fattore, che la visualizzazione degli errori sia abilitata nel file di configurazione php.ini, dato che se non è impostato su 1 il valore display_errors, tutti i problemi catturati non verranno stampati a video. Per ovviare a ciò accertiamoci di modificarlo:

ini_set("display_errors", "1");

Discorso inverso per quando abbiamo finito il debug:

ini_set("display_errors", "0");

Detto ciò vediamo vediamo altri parametri, modificabili sempre tramite ini_set() come visto prima con display_errors, utili per gestire al meglio gli errori:

  • log_errors: Attiva o meno il salvataggio del log con gli errori. Con 0 è disattivato, con 1 il contrario.
  • log_errors_max_len: Indica il peso massimo del log, di default è 1024 byte (1kB). Per togliere queste restrizioni basta passare come parametro 0
  • error_log: Imposta il percorso in cui verrà salvato il log, che conterrà tutti gli errori intercettati, tramite i livelli impostati.
  • display_startup_errors: Indica se mostrare gli errori che si possono verificare nella fase di inizializzazione di PHP. 0 disattivato, 1 attivato.
  • html_errors: Abilita l'inserimento di tag html nell'errore se impostato su 1, altrimenti mostra un testo semplice.
  • track_errors: Assegna alla variabile $php_errormsg, l'errore che è stato catturato. (Valore: 0 / 1)

Infine ecco un esempio completo, di tutto quello detto prima, che genera tutti gli errori principali:

error_reporting(E_ALL | E_STRICT);  
ini_set("display_errors", 1);  
ini_set("html_errors", 1);
ini_set("display_startup_errors", 1); 
ini_set("track_errors", 1);   
ini_set("error_log", "/logz.txt");  
ini_set("log_errors", 1);  
ini_set("log_errors_max_len", 0);  
		
split("ciao a tutti", " ");
echo $ciao["ginho"];
fopen("sono/un/pro.txt");
Strumenti::creaLink("i");
fiunsc();

Errori deprecated, notice, warning, strict, fatal error

I più letti

Ti potrebbero interessare