Comment obtenir des messages d’erreur utiles en PHP?

Je trouve la programmation en PHP assez frustrante. Très souvent, je vais essayer de lancer le script et de récupérer un écran vide. Pas de message d’erreur, juste un écran vide. La cause peut être une erreur de syntaxe simple (mauvais crochet, point-virgule manquant) ou un appel de fonction ayant échoué, ou autre chose.

Il est très difficile de comprendre ce qui a mal tourné. Je finis par commenter le code, en entrant des déclarations “echo” partout, etc. en essayant de réduire le problème. Mais il doit sûrement y avoir un meilleur moyen, non?

Alors, y a-t-il un moyen de faire en sorte que PHP produise un message d’erreur utile comme Java? Quelqu’un peut-il recommander de bons conseils, outils et techniques de débogage PHP?

Pour les erreurs de syntaxe, vous devez activer l’affichage d’erreur dans le fichier php.ini. Par défaut, ils sont désactivés car vous ne voulez pas qu’un “client” voit les messages d’erreur. Consultez cette page dans la documentation PHP pour plus d’informations sur les 2 directives: error_reporting et display_errors . display_errors est probablement celui que vous souhaitez modifier. Si vous ne pouvez pas modifier le fichier php.ini, vous pouvez également append les lignes suivantes à un fichier .htaccess:

 php_flag display_errors on php_value error_reporting 2039 

Vous pouvez envisager d’utiliser la valeur de E_ALL (mentionnée par Gumbo) pour votre version de PHP pour error_reporting afin d’obtenir toutes les erreurs. Plus d’informations

3 autres éléments: (1) Vous pouvez vérifier le fichier journal des erreurs car il contiendra toutes les erreurs (sauf si la journalisation a été désactivée). (2) L’ajout des 2 lignes suivantes vous aidera à déboguer les erreurs qui ne sont pas des erreurs de syntaxe:

 error_reporting(-1); ini_set('display_errors', 'On'); 

(3) Une autre option consiste à utiliser un éditeur qui vérifie les erreurs lorsque vous tapez, comme PhpEd . PhpEd est également livré avec un débogueur qui peut fournir des informations plus détaillées. (Le débogueur de PhpEd est très similaire à xdebug et s’intègre directement dans l’éditeur, donc vous utilisez 1 programme pour tout faire.)

Le lien de Cartman est également très bon: http://www.ibm.com/developerworks/library/os-debug/

Ce qui suit permet toutes les erreurs:

 ini_set('display_startup_errors', 1); ini_set('display_errors', 1); error_reporting(-1); 

Voir aussi les liens suivants

Vous pouvez inclure les lignes suivantes dans le fichier que vous souhaitez déboguer:

 error_reporting(E_ALL); ini_set('display_errors', '1'); 

Cela remplace les parameters par défaut de php.ini, qui ne font que signaler les erreurs au journal.

Configuration PHP

2 entrées dans php.ini dictent la sortie des erreurs:

  1. display_errors
  2. error_reporting

En production , display_errors est généralement défini sur Off (ce qui est une bonne chose car l’affichage des erreurs dans les sites de production n’est généralement pas souhaitable!).

Cependant, en cours de développement , il doit être défini sur On pour que les erreurs soient affichées. Vérifiez !

error_reporting (à partir de PHP 5.3) est défini par défaut sur E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED (ce qui signifie que tout est affiché à l’exception des notifications, des normes ssortingctes et des avis de dépréciation). En cas de doute, définissez-le sur E_ALL pour afficher toutes les erreurs. Vérifiez !

Whoa whoa! Pas de chèque! Je ne peux pas changer mon php.ini!

C’est une honte. Habituellement, les hôtes partagés ne permettent pas la modification de leur fichier php.ini et, par conséquent, cette option est malheureusement indisponible. Mais n’ayez crainte! Nous avons d’autres options!

Configuration du runtime

Dans le script souhaité, nous pouvons modifier les entrées php.ini en runtime! Ce qui signifie, ça va courir quand le script s’exécute! Doux!

 error_reporting (E_ALL); ini_set ("display_errors", "On"); 

Ces deux lignes feront le même effet que de modifier les entrées php.ini comme ci-dessus! Impressionnant!

J’ai toujours une page blanche / 500 erreur!

Cela signifie que le script n’a même pas fonctionné! Cela se produit généralement lorsque vous avez une erreur de syntaxe!

Avec les erreurs de syntaxe, le script n’arrive même pas à l’exécution. Il échoue au moment de la compilation , ce qui signifie qu’il utilisera les valeurs de php.ini, ce qui, si vous n’aviez pas changé, pourrait ne pas permettre l’affichage d’erreurs.

Journaux d’erreur

De plus, PHP enregistre par défaut les erreurs. Dans l’hébergement partagé, il peut s’agir d’un dossier dédié ou du même dossier que le script incriminé.

Si vous avez access à php.ini, vous pouvez le trouver sous l’entrée error_log .

Il existe une extension très utile appelée ” xdebug ” qui rendra vos rapports beaucoup plus agréables.

Pour un dépannage rapide et pratique, je suggère normalement ici sur SO:

 error_reporting(~0); ini_set('display_errors', 1); 

à mettre au début du script qui est en cours de dépannage. Ce n’est pas parfait, la variante parfaite est que vous l’ php.ini aussi dans le php.ini et que vous enregissortingez les erreurs dans PHP pour détecter les erreurs de syntaxe et de démarrage.

Les parameters décrits ici affichent toutes les erreurs, notifications et avertissements, y compris les plus ssortingcts, quelle que soit la version de PHP.

Les prochaines choses à considérer:

  • Installez Xdebug et activez le débogage à distance avec votre IDE.

Voir aussi:

  • Rapport d’erreur (PHP dans le bon sens)
  • Documents de constantes prédéfinies
  • error_reporting() Docs
  • display_errors Docs

Si vous êtes super cool, vous pouvez essayer:

 $test_server = $_SERVER['SERVER_NAME'] == "127.0.0.1" || $_SERVER['SERVER_NAME'] == "localhost" || substr($_SERVER['SERVER_NAME'],0,3) == "192"; ini_set('display_errors',$test_server); error_reporting(E_ALL|E_STRICT); 

Cela affichera uniquement les erreurs lorsque vous exécutez localement. Il vous donne également la variable test_server à utiliser à d’autres endroits, le cas échéant.

Toute erreur survenue avant l’exécution du script ne sera pas interceptée, mais pour 99% des erreurs que je commets, ce n’est pas un problème.

En haut de la page, choisissez un paramètre

 error_reporting(E_ERROR | E_WARNING | E_PARSE); 

Pour conserver cela et le rendre confortale, vous pouvez éditer votre fichier php.ini. Il est généralement stocké dans /etc/php.ini ou /etc/php/php.ini , mais plus de php.ini local peut le remplacer, en fonction des instructions de configuration de votre hébergeur. Vérifiez un fichier phpinfo() pour le fichier de Loaded Configuration File en haut, pour vous assurer que le Loaded Configuration File est chargé en dernier.

Recherchez les display_errors dans ce fichier. Il ne devrait y avoir que 3 instances, dont 2 sont commentées.

Changez la ligne non commentée pour:

 display_errors = stdout 
 error_reporting(E_ALL | E_STRICT); ini_set('display_errors', 1); ini_set('html_errors', 1); 

De plus, vous pouvez obtenir des informations plus détaillées avec xdebug .

Je recommande Nette Tracy pour une meilleure visualisation des erreurs et des exceptions en PHP:

Nette Tracy capture d'écran

 error_reporting(E_ALL | E_STRICT); 

Et activer les erreurs d’affichage dans php.ini

Vous pouvez enregistrer votre propre gestionnaire d’erreurs en PHP. La suppression de toutes les erreurs dans un fichier peut vous aider dans ces cas obscurs, par exemple. Notez que votre fonction sera appelée, quel que soit le paramètre error_reporting actuel. Exemple très basique:

 function dump_error_to_file($errno, $errstr) { file_put_contents('/tmp/php-errors', date('Ymd H:i:s - ') . $errstr, FILE_APPEND); } set_error_handler('dump_error_to_file'); 

Essayez cet outil de référence de rapport d’erreur PHP . C’est une très bonne référence visuelle qui m’a aidé à comprendre le mécanisme complexe de signalement des erreurs.

Vous pouvez également essayer PHPStorm en tant qu’éditeur de code. Vous trouverez de nombreuses erreurs de syntaxe PHP et autres dès que vous tapez dans l’éditeur.

Les deux lignes clés dont vous avez besoin pour obtenir des erreurs utiles en PHP sont:

 ini_set('display_errors',1); error_reporting(E_ALL); 

Comme souligné par d’autres consortingbuteurs, ceux-ci sont désactivés par défaut pour des raisons de sécurité. Conseil utile: lorsque vous configurez votre site, il est pratique de faire un changement pour vos différents environnements afin que ces erreurs soient activées par défaut dans vos environnements locaux et de développement. Cela peut être réalisé avec le code suivant (idéalement dans votre fichier index.php ou config, ceci est actif dès le début):

 switch($_SERVER['SERVER_NAME']) { // local case 'yourdomain.dev': // dev case 'dev.yourdomain.com': ini_set('display_errors',1); error_reporting(E_ALL); break; //live case 'yourdomain.com': //... break; } 

FirePHP peut également être utile.

si vous êtes un utilisateur d’ubuntu, allez à votre terminal et lancez cette commande

 sudo tail -50f /var/log/apache2/error.log 

où il affichera 50 erreurs récentes. Il y a un fichier d’erreur error.log pour apache2 qui enregistre toutes les erreurs.

 ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); 

Vous pouvez activer le rapport d’erreur complet (y compris les notifications et les messages ssortingcts). Certaines personnes trouvent cela trop verbeux, mais ça vaut le coup d’essayer. Définissez error_reporting sur E_ALL | E_STRICT E_ALL | E_STRICT dans votre php.ini.

 error_reporting = E_ALL | E_STRICT 

E_STRICT vous informera des fonctions obsolètes et vous recommandera les meilleures méthodes pour effectuer certaines tâches.

Si vous ne voulez pas d’avis, mais que vous trouvez d’autres types de messages utiles, essayez d’exclure les avis:

 error_reporting = (E_ALL | E_STRICT) & ~E_NOTICE 

Assurez-vous également que display_errors est activé dans php.ini. Si votre version de PHP est antérieure à 5.2.4, définissez-la sur On :

 display_errors = "On" 

Si votre version est 5.2.4 ou plus récente, utilisez:

 display_errors = "stderr" 

Pour activer le rapport d’erreur complet, ajoutez-le à votre script:

 error_reporting(E_ALL); 

Cela provoque même des avertissements minimes à afficher. Et au cas où:

 ini_set('display_errors', '1'); 

Forcera l’affichage des erreurs. Cela doit être désactivé sur les serveurs de production, mais pas lors du développement.

Mis à part error_reporting et le paramètre display_errors ini, vous pouvez obtenir des erreurs SYNTAX à partir des fichiers journaux de votre serveur Web. Lorsque je développe PHP, je charge les journaux du serveur Web de mon système de développement dans mon éditeur. Chaque fois que je teste une page et que je reçois un écran vide, le fichier journal devient obsolète et mon éditeur me demande si je veux le recharger. Quand je le fais, je saute au fond et il y a l’erreur de syntaxe. Par exemple:

 [Sun Apr 19 19:09:11 2009] [error] [client 127.0.0.1] PHP Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in D:\\webroot\\test\\test.php on line 9 

Les «ERREURS» sont les choses les plus utiles pour que les développeurs puissent connaître leurs erreurs et les résoudre pour que le système fonctionne parfaitement.

PHP fournit certaines des meilleures façons de connaître les développeurs pour savoir où et où leur code reçoit les erreurs. En connaissant ces erreurs, les développeurs peuvent améliorer leur code de plusieurs manières.

Les meilleures façons d’écrire les deux lignes suivantes en haut du script pour obtenir tous les messages d’erreur:

 error_reporting(E_ALL); ini_set("display_errors", 1); 

Une autre façon d’utiliser les outils de débogage tels que xdebug dans votre IDE.

L’activation du rapport d’erreur est la solution correcte, mais elle ne semble pas prendre effet dans le programme qui l’active, mais uniquement dans les programmes inclus par la suite.

Ainsi, je crée toujours un fichier / programme (que j’appelle habituellement “genwrap.php”) qui a essentiellement le même code que la solution populaire ici (c.-à-d. Activer le rapport d’erreur) et inclut également la page que je veux appel.

Il y a 2 étapes pour implémenter ce débogage;

One – créer genwrap.php et y mettre ce code:

 < ?php error_reporting(-1); ini_set('display_errors', 'On'); include($_REQUEST['page']); ?> 

Deux – changer le lien vers le programme / page que vous souhaitez déboguer pour passer via genwrap.php,

Ex: changement:

 $.ajax('dir/pgm.php?param=val').done(function(data) { /* ... */ 

à

 $.ajax('dir/genwrap.php?page=pgm.php&param=val').done(function(data) { /* ... */ 

http://todell.com/debug peut également être utile. Vous pouvez voir les valeurs de vos objects ou les erreurs de débogage générées derrière la scène, même en mode production.

En plus des très nombreuses réponses ci-dessus, vous pouvez également implémenter les deux fonctions suivantes dans vos projets. Ils attraperont toutes les erreurs non syntaxiques avant la sortie de l’application / du script. À l’intérieur des fonctions, vous pouvez effectuer un backtrace et enregistrer ou rendre un message agréable «Site en cours de maintenance» au public.

Erreurs fatales:

 register_shutdown_function 

http://php.net/manual/en/function.register-shutdown-function.php

Les erreurs:

 set_error_handler 

http://php.net/manual/en/function.set-error-handler.php

Backtracing:

 debug_backtrace 

http://php.net/manual/en/function.debug-backtrace.php

Utilisez Kint. C’est une combinaison de commandes de débogage sur les stéroïdes. https://kint-php.github.io/kint/ It est très similaire à Nette Tracy

Mon problème habituel sont des erreurs d’parsings “petites et stupides” qui malheureusement n’apparaissent pas.

Cependant, lorsqu’un fichier .PHP contient un fichier contenant des erreurs d’parsing, elles sont affichées! J’ai donc eu l’idée d’écrire un petit “script d’exécuteur” lancé avec le nom du fichier buggé en argument, par exemple example.com/sx.php?sc=buggy.php

Cela m’avait déjà évité beaucoup de maux de tête, peut-être que ça pourrait aider quelqu’un d’autre aussi 🙂

sx.php

 $sc = $_GET["sc"]; if ((!isset($_GET["sc"]) && empty($_GET["sc"]))) { echo "Please select file to execute using ?sc= (you may omit the .PHP-extension)"; } else { $sc = $_GET["sc"]; if (false==ssortingpos('.php',$sc)) $sc.='.php'; // adjust this if your preferred extension is php5! require($sc); } ?>