19 Mar 2011 2 commenti
Evitare la visualizzazione degli errori quando il sito è on line e aperto all'utenza è di importanza cruciale per diverse ragioni: oltre che essere un'evenienza imbarazzante, questa crea "traumi" agli utenti e può costituire una rischio per la sicurezza.
Tuttavia, nei precedenti articoli, si è già evidenziato la distinzione fra visualizzazione e rilevazione degli errori: pur disattivando la visualizzazione degli errori quando il sito è in fase di produzione, la loro rilevazione è comunque opportuna per conoscere i problemi di cui soffre il nostro sito e apportare i necessari correttivi.
Sempre nei precedenti articoli, si è già parlato dell'importanza di gestire in maniera differente gli errori in fase di sviluppo e in fase di produzione (sito accessibile all'utenza) e si evidenziò come le due principali direttive in questo ambito fossero l'error_reporting e il display_errors.
IMPOSTAZIONE DEGLI ERRORI NELLA FASE DI PRODUZIONE
L'impostazione potrà avvenire tramite il php.ini, file .htaccess da collocare nella document root o run-time attraverso un file php da includere in tutte le pagine web. Personalmente preferisco il secondo dei tre metodi proposti.
La logica che si seguirà sarà la seguete:
- disabilitare la visualizzazione di tutti gli errori;
- rilevare tutti gli errori di tipo PARSE ERROR, FATAL ERROR, WARNING e NOTICE (verranno trascurati gli errori di tipo DEPRECATED e STRICT);
- ignorare errori duplicati;
- salvare gli errori su un file di log e impedirne l'accesso diretto (evitare che tutti possano leggerlo).
Settaggio tramite php.ini:
error_reporting = E_ALL & ~E_DEPRECATED display_errors = Off display_startup_errors = Off log_errors = On log_errors_max_len = 0 ignore_repeated_errors = On ignore_repeated_source = On track_errors = On error_log = "/percorso/file/php_error.log"
Settaggio tramite .htaccess da posizionare nella root del sito:
php_value error_reporting 22527 php_flag display_errors false php_flag display_startup_errors false php_flag log_errors true php_value log_errors_max_len 0 php_flag ignore_repeated_errors true php_flag ignore_repeated_source true php_flag report_memleaks true php_flag track_errors true php_value error_log /percorso/file/php_error.log
Ricordo che il valore numerico dell'error_reporting si è modificato nel tempo: infatti il valore della costante E_ALL nella versione di php 5.3 è di 30719, nella versione 5.2 è di 6143, mentre nelle precedenti è di 2047. Inoltre, la costante E_DEPRECATED è stata introdotta dalla versione di php superiore alla 5.3. Per ottenere il valore numerico dell'error_reporting potrete eseguite questa operazione:
<?php echo E_ALL - (defined('E_DEPRECATED')? E_DEPRECATED : 0); ?>
Settaggio "run-time" all'interno di un file php:
<?php error_reporting(E_ALL & ~E_DEPRECATED); ini_set('display_errors',0); ini_set('display_startup_errors',0); ini_set('log_errors',1); ini_set('log_errors_max_len',0); ini_set('ignore_repeated_errors',1); ini_set('ignore_repeated_source',1); ini_set('report_memleaks',1); ini_set('track_errors',1); ini_set('error_log','/percorso/file/php_error.log'); ?>
A questo punto dovremo impedire l'accesso al file di log attraverso direttiva da apporre nel file .htaccess:
<Files /percorso/file/php_error.log> Order allow,deny Deny from all Satisfy All </Files>
ANALISI DEGLI ERRORI RILEVATI E SALVATI SUL FILE DI LOG
Una volta fatti i seguenti settaggi sarà nostra premura analizzare periodicamente gli errori che si andranno a salvare sul file di log: ciò potrà essere fatto manualmente (accedendo al file tramite ftp) oppure tramite script php.
In questo secondo caso possiamo operare in diversi modi: impostare un cron job o operazione pianificata che ci invii periodicamente tramite email gli errori registrati sul file di log, oppure che ci visualizzi una notifica nel pannello di amministrazione del nostro sito.
La sua realizzazione potrà essere più o meno complessa. In ogni caso, siccome gli errori verranno scritti uno per ogni rigo questi potranno essere agevolmente letti attraverso la funzione file() di php.
<?php // ovviamente il seguente file dovrà essere protetto... $array_log = file('/percorso/file/php_error.log'); foreach($array_log as $error) { echo '<p>'.$error.'</p>'; } ?>
Un metodo alternativo a quello appena descritto che ci consente di tener traccia in tempo reale degli errori generati dal nostro sito consiste nell'utilizzo della funzione set_error_handler() la cui trattazione sarà fatta nella prossima lezione.
Olimpio Romanella
Sono un appassionato di Web Developing con un particolare debole per php. Mi dedico principalmente dello sviluppo back-end ed in particolare programmazione lato server con php, sviluppo di database relazionali MySql e progettazione di CMS di piccole e medie dimensioni.
Mi avvalgo del framework javascript Jquery, utilizzando molti dei suoi plugin e nei dei miei progetti utilizzo spesso il framework MVC Codeigniter.
perseo
19 February 2016 ore 12:33