Visualizzare gli errori PHP
Errare è umano, e nel software capire quale errore si verifica è il passo più importante per risolvere i problemi. Purtroppo capita (troppo) spesso che la gestione degli errori non sia impostata adeguatamente alla situazione. Molti provider impostano gli errori affinché non vengano visualizzati (“è per la sicurezza!”) poi quando qualcosa non va si brancola nel buio. Ecco una guida definitiva per impostare correttamente gli errori, e per vederli o loggarli a seconda delle necessità.
Errori PHP
Ecco le istruzioni disponibili in PHP per controllare la gestione degli errori.
Visualizzare a video, oppure no
@ini_set('display_errors', 'on'); // oppure off
Decide se visualizzare gli errori (‘on’) oppure no (‘off’) a video.
Quali errori vedere
// Disabilita i Notice, i Warning, i Strict Standards e i Deprecated @error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING & ~E_STRICT & ~E_DEPRECATED);
A scanso di equivoci: i Notice non sono errori e salvo vogliate fare le limature al software non dovete vederli.
i Warning sono avvisi che non necessariamente rappresentano errori, però in fase di messa a punto o in caso di problemi vi può interessare vederli.
Ho aggiunto alla lista dei messaggi da escludere anche quelli di conformità strict standard, una noiosa novità del php 5.3+: se usate un software non scritto da voi non vi interessano.
Loggare errori su file
Molto utile (anche per capire cosa il vs codice sta facendo) è loggare errori e messaggi in un file. E’ possibile attivare questa funzione e specificare come si deve chiamare il file in questione con
ini_set('log_errors', 1); // Da ora gli errori vanno anche su file ini_set('error_log', "/tmp/php-error.log"); // Il file che conterrà gli errori è /tmp/php-error.log error_log( "Sto facendo questa cosa" ); // Un messaggio che mi fa comodo vedere sul log
Nella ini_set error_log si può omettere il percorso, in questo caso il file verrà creato nella cartella corrente (qual’è? attenzione, in alcuni casi non è immediato scoprirlo)
Da notare che questa impostazione nulla ha che vedere con la stampa errori a video, quindi possiamo avere una, l’altra, entrambe, o nessuna.
WordPress
In WordPress il posto migliore per mettere queste istruzioni sarebbe il file wp-config.php, se vogliamo che l’impostazione valga per tutto il sito.
WordPress ha però delle sue direttive per il logging errori che nelle versioni più recenti hanno priorità rispetto alle varie ini_set viste sopra.
define( 'WP_DEBUG', true ); // SI - Attivo il debug define( 'WP_DEBUG_DISPLAY', true ); // SI - Voglio vedere i messaggi a video define( 'WP_DEBUG_LOG', true ); // SI - Voglio loggare i messaggi
Il comportamento di WordPress delle versioni più recenti è quello di mandare una email al gestore del sito in caso si verifichino errori. Se l’invio della mail non funziona (succede) vi trovate nella grottesca situazione di non capire cosa sta succedendo, quindi attivare il debug con le istruzioni qui sopra nel wp-config.php può essere di grande aiuto. A problemi risolti ricordate di reimpostare WP_DEBUG a false.
Prestashop
In Prestahop un buon punto dove impostare la gestione degli errori è il file config/config.inc.php, dopo la prima define. Ecco una impostazione buona per un ecommerce che si sta mettendo a punto o che ha avuto qualche problema:
@ini_set('display_errors', 'on'); @error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING & ~E_STRICT & ~E_DEPRECATED); // Disabilita i Notice, i Warning e i Deprecated, vedi solo gli errori gravi
Script PHP generici
In un generico script PHP queste istruzioni vanno messe all’inizio del file. E’ buona norma usare un unico file da includere in tutto il progetto, e mettere queste istruzioni lì una volta per tutte, piuttosto che ricopiarle in tutti i file.
la funzione BackTrace
Risulta particolarmente utile capire come il programma è finito in una specifica funzione, ovvero la sequenza di chiamate sullo stack. Ecco allora una funzione utile, che ritengo la migliore alternativa all’usare un ambiente che consente l’esecuzione passo-passo:
function debug_bt() { $echo = ''; if(!function_exists('debug_backtrace')) { $echo .= 'function debug_backtrace does not exist'."<br/>\n"; return $echo; } $echo .= "<br/>\n----------------<br/>\n"; $echo .= "Debug backtrace:<br/>\n"; $echo .= "----------------<br/>\n"; foreach(debug_backtrace() as $t) { $echo .= "\t" . '@ '; if(isset($t['file'])) $echo .= basename($t['file']) . ':' . $t['line']; else { $echo .= '(PHP inner-code)'; } $echo .= ' -- '; if(isset($t['class'])) $echo .= $t['class'] . $t['type']; $echo .= $t['function']; if(isset($t['args']) && sizeof($t['args']) > 0) $echo .= '(...)'; else $echo .= '()'; $echo .= "<br/>\n"; } return $echo; }
questa sarà richiamabile o con:
die( debug_bt() ); echo (debug_bt() );
a seconda che vogliate fermare l’esecuzione o meno dopo la stampa, mentre quando siete dentro una classe PHP definitela come
public static function debug_bt()
in modo che potrete richiamarla, per esempio, con
echo( myClass::debug_bt() );
Conclusioni
Se uno sito fa le bizze la prima cosa da fare è abilitare gli errori, e questa guida è stata scritta proprio per questo. Attenzione, non tutti i provider consentono di gestire gli errori, se il vostro non ve lo permette questa è una llista di hosting provider consigliati su cui queste tecniche appena illustrate non solo funzionano, ma dove le impostazioni sono già quelle ottimali per mettere a punto un sito senza impazzire.
Se questo articolo ti è stato utile, per favore condividilo!
Lascia un Commento
Vuoi partecipare alla discussione?Sentitevi liberi di contribuire!