Apache Virtualhost e PHP error reporting

20 dicembre 2013

Può capitare di dover adottare, solo per uno specifico sito, una particolare configurazione della visualizzazione degli errori di PHP. Con Apache ciò è possibile configurando con le opportune direttive l'error reporting a livello di Virtual Host, lasciando nel contempo immutata la configurazione generale di php.ini.

Partiamo dal presupposto che PHP (versione 5.x) funzioni come modulo di Apache e che la direttiva generale nel file di configurazione sia:

error_reporting = E_ALL 

Questa è sicuramente la scelta migliore su un server di sviluppo, ma immaginiamo di avere un'applicazione web datata, su cui dobbiamo mettere le mani senza riscriverla da cima a fondo. In questo caso è probabile che saremmo tempestati da warning, notice e via discorrendo.
Per evitarli sarebbe più utile una configurazione del tipo:

error_reporting = E_ALL & ~E_NOTICE & ~E_WARNING & ~E_DEPRECATED & ~E_STRICT

A livello di host virtuale possiamo raggiungere l'obbiettivo inserendo la seguente direttiva:


..........
php_admin_value error_reporting 22517
..........

A questo punto vediamo il perchè di una simile configurazione.


Innanzitutto va' notato che possiamo utilizzare le costanti predefinite per la gestione degli errori solo all'interno del file php.ini, ma non nelle configurazioni di Apache. Consultando l'elenco delle costanti predefinite ci accorgiamo però che a ciascuna di esse corrisponde un valore numerico intero. Ad esempio ad E_WARNING corrisponde il valore 2.

Ora non dobbiamo fare altro che applicare i cosiddetti operatori Bitwise per generare il valore numerico che vogliamo usare nella direttiva di Apache. In pratica giochiamo un po' con i numeri binari per combinare o mascherare i vari tipi di errore.

Vediamo subito come ottenere velocemente il valore numerico necessario e poi vedremo una spiegazione più dettagliata. Creiamo ed eseguiamo questo semplice script:


/*
oppure con le costanti
echo(E_ALL & ~E_NOTICE & ~E_WARNING & ~E_DEPRECATED & ~E_STRICT);
*/

Il cui output sarà proprio 22517


Attenzione il valore corrispondente alla costante E_ALL varia a seconda della versione di PHP utilizzata. Nel nostro caso consideriamo il numero decimale 32767 valido a partire dalla versione 5.4.x.

Abbiamo detto che possiamo rappresentare E_WARNING con il valore 2, in binario:

21421321221121029282726252423222120
000000000000010

Quindi per ~E_WARNING basterà capovolgere il valore dei bit (operazione NOT):

21421321221121029282726252423222120
111111111111101

Procediamo in maniera analoga per le altre costanti negate e facciamo infine un AND tra E_ALL e queste ultime.

21421321221121029282726252423222120
111111111111111ANDE_ALL
111111111111101AND~E_WARNING
111111111110111AND~E_NOTICE
101111111111111AND~E_DEPRECATED
111011111111111=~E_STRICT
10101111111010122517 decimale

In questo modo abbiamo ottenuto il medesimo risultato in maniera più formale.