En regardant la liste de mes derniers billets, je me rends compte que ça faisait longtemps que je n'avais pas abordé un sujet relié au langage PHP. Ce dont je vais parler concerne un point que tout développeur PHP devrait être informé au moment de mettre un site en production.
Pendant la période de quelques semaines ou mois que nécessite le développement d'un site web, il est clair que c'est pratique de configurer PHP de façon à montrer les erreurs explicitement pour pouvoir effectuer le débogage qui s'impose. Or, quand vient le temps de placer le site web en production, si une erreur se produit et que la configuration n'a pas été modifiée, les visiteurs verront le détail technique de l'erreur, y compris les hackers qui pourraient être tentés de tirer profit de cette faille.
C'est pourquoi il est primordial de cacher les erreurs sur les serveurs de production. Voici quelques exemples d'erreurs rencontrées fréquemment :
E_WARNING
echo 10/0;Warning: Division by zero in...
E_NOTICE
echo 10/$undefinedVariable;Notice: Undefined variable: undefinedVariable in...
E_FATAL
echo $obj->undefFunction();Fatal error: Call to a member function test() on a non-object in...
Par défaut, PHP 4 et 5 sont configurés pour rapporter tous les types d'erreurs sauf les notices (E_ALL & ~E_NOTICE). Ces erreurs peuvent être prises en charge en étant écrites dans un fichier de log (on en retrouve dans error.log d'Apache) ou encore les manipuler d'une façon particulière en utilisant la fonction set_error_handler() (pour les enregistrer dans une base de données ou envoyer une note par courriel à l'administrateur système).
On peut spécifier les différents types d'erreurs à rapporter en utilisant une combinaison de constantes prédéfinies avec des opérateurs bitwise. Par exemple : error_reporting(E_ERROR | E_WARNING | E_PARSE);
Pour le moment, je vais m'en tenir à E_ALL.
Dans le code PHP :
error_reporting(E_ALL);Par php.ini :
// ou
ini_set('error_reporting', E_ALL);
error_reporting = E_ALLPar .htaccess (non recommandé) :
php_value error_reporting 6143Ici, les constantes ne sont pas reconnues à ce niveau. On doit utiliser la valeur entière équivalente à E_ALL. Habituez-vous à utiliser les constantes plutôt que les valeurs. D'abord parce que c'est plus lisible et selon la version de PHP, elles ne possèdent pas la même valeur :
Valeur de E_ALL dans différentes versions de PHP :
PHP < 5.2 = 2047
PHP 5.2.x = 6143
PHP 5.3.x = 30719
PHP 6 = 32767
Maintenant qu'on a défini les types d'erreurs à dévoiler au moment du runtime, il faut savoir que ceci n'a rien à voir avec l'affichage des messages qu'on voit à l'écran. Qu'on les affiche ou non, les erreurs seront rapportées à l'interne. En fait, on pourrait probablement ne rapporter aucune erreur mais ça ne nous serait d'aucune utilité. Ce qu'on veut pour la production, c'est de ne pas les afficher aux utilisateurs. La configuration est toute simple et peut aussi se faire à différents niveaux. Dans le code PHP :
ini_set('display_errors', 0);Par php.ini :
display_errors = offPar .htaccess :
php_value display_errors offNotez qu'une autre option possible est de faire afficher une page d'erreur 500 avec un message amical expliquant au visiteur qu'une erreur s'est produite et que vous rectifierez la situation le plus rapidement possible (mieux que d'afficher l'erreur elle-même).
Dans .htaccess :
ErrorDocument 500 /oups.php