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!

0 commenti

Lascia un Commento

Vuoi partecipare alla discussione?
Sentitevi liberi di contribuire!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *