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 è il file wp-config.php, se vogliamo che l’impostazione valga per tutto il sito.
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 lista 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!