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:
214 | 213 | 212 | 211 | 210 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
Quindi per ~E_WARNING basterà capovolgere il valore dei bit (operazione NOT):
214 | 213 | 212 | 211 | 210 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 |
Procediamo in maniera analoga per le altre costanti negate e facciamo infine un AND tra E_ALL e queste ultime.
214 | 213 | 212 | 211 | 210 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | ||
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | AND | E_ALL |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | AND | ~E_WARNING |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | AND | ~E_NOTICE |
1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | AND | ~E_DEPRECATED |
1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | = | ~E_STRICT |
1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 1 | 22517 decimale |
In questo modo abbiamo ottenuto il medesimo risultato in maniera più formale.