web-dev-qa-db-fra.com

Comment puis-je obtenir des messages d'erreur utiles en PHP?

Je trouve la programmation dans PHP assez frustrante. Très souvent, je vais essayer d’exécuter le script et d’obtenir un écran vierge. Aucun message d'erreur, il suffit de vider l'écran. La cause peut être une simple erreur de syntaxe (crochet incorrect, point-virgule manquant), 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 écrivant 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 d’obtenir que PHP produise un message d’erreur utile comme le fait Java? Quelqu'un peut-il recommander de bons conseils et techniques de débogage PHP?

550
Candidasa

Pour les erreurs de syntaxe, vous devez activer l'affichage des erreurs dans le fichier php.ini. Par défaut, ils sont désactivés car vous ne voulez pas qu'un "client" voie 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 ajouter les lignes suivantes à un fichier .htaccess:

php_flag  display_errors        on
php_value error_reporting       2039

Vous voudrez peut-être envisager d'utiliser la valeur de E_ALL (comme le mentionne Gumbo) pour votre version de PHP pour error_reporting afin d'obtenir toutes les erreurs. plus d'infos

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 des 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 lors de la frappe, tel que PhpEd . PhpEd est également livré avec un débogueur qui peut fournir des informations plus détaillées. (Le débogueur PhpEd est très similaire à xdebug et s’intègre directement dans l’éditeur afin que vous utilisiez 1 programme pour tout faire.)

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

479
Darryl Hein

Ce qui suit active toutes les erreurs:

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

Voir aussi les liens suivants

440
Eljakim

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 paramètres par défaut dans php.ini, ce qui oblige PHP à rapporter les erreurs dans le journal.

56
Tomalak

Configuration PHP

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

  1. display_errors
  2. error_reporting

Dans la production , _display_errors_ est généralement défini sur Off (ce qui est une bonne chose, car l'affichage des erreurs sur les sites de production est généralement pas souhaitable!).

Cependant, dans développement , il devrait être réglé sur On, afin 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é sauf les avis, les normes strictes et les avis de dépréciation). En cas de doute, réglez-le sur _E_ALL_ pour afficher toutes les erreurs . Vérifiez !

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

C'est une honte. Habituellement, les hôtes partagés n'autorisent pas la modification de leur fichier php.ini. Cette option est donc malheureusement indisponible. Mais n'ayez crainte! Nous avons autres options !

Configuration d'exécution

Dans le script souhaité, nous pouvons modifier les entrées php.ini au runtime! Cela signifie que le script sera exécuté! Sucré!

_error_reporting(E_ALL);
ini_set("display_errors", "On");_

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

Je reçois toujours une page blanche/500 erreur!

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

Avec des erreurs de syntaxe, le script ne parvient même pas à l'exécution. Il échoue au moment de la compilation , ce qui signifie qu'il utilisera les valeurs du fichier php.ini, qui, si vous n'aviez pas changé, risquent de ne pas autoriser l'affichage. des 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 accès à php.ini, vous pouvez le trouver sous l'entrée error_log.

51
Madara Uchiha

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

30
gnarf

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

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

être mis au début du script qui est sous le dépannage. Ce n’est pas parfait, la variante parfaite est que vous activez également cela dans le php.ini et que vous enregistrez les erreurs dans PHP pour intercepter les erreurs de syntaxe et de démarrage.

Les paramètres décrits ici affichent toutes les erreurs, avis et avertissements, y compris les avertissements stricts, quelle que soit la version PHP.

Points suivants à considérer:

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

Voir aussi:

25
hakre

En haut de la page, choisissez un paramètre

error_reporting(E_ERROR | E_WARNING | E_PARSE);
16
Kld

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 ailleurs, le cas échéant.

Les erreurs qui se produisent avant l'exécution du script ne seront pas interceptées, mais pour 99% des erreurs que je fais, ce n'est pas un problème.

16
Rich Bradshaw
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
15
Abuzer Firdousi

Pour le conserver et le rendre plus confortable, vous pouvez éditer votre fichier php.ini. Il est généralement stocké dans /etc/php.ini ou /etc/php/php.ini, mais plusieurs php.ini locaux peuvent l'écraser, en fonction des instructions d'installation de votre fournisseur d'hébergement. Recherchez dans le fichier phpinfo() le Loaded Configuration File (en haut) pour savoir lequel est chargé en dernier.

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

Remplacez la ligne non commentée par:

display_errors = stdout
15
Ram

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

Nette Tracy screenshot

13
Ondřej Šotek
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 .

13
Yan.Zero
error_reporting(E_ALL | E_STRICT);

Et activer les erreurs d'affichage dans php.ini

10
Ólafur Waage

Vous pouvez enregistrer votre propre gestionnaire d'erreur en PHP. Dumping de toutes les erreurs dans un fichier peut vous aider dans ces cas obscurs, par exemple. Notez que votre fonction sera appelée, peu importe votre valeur actuelle error_reporting . Exemple très basique:

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

Essayez ceci 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.

7
Rodney McIntosh

Vous voudrez peut-être aussi essayer PHPStorm comme éditeur de code. Il trouvera beaucoup de PHP et d’autres erreurs de syntaxe au fur et à mesure que vous tapez dans l’éditeur.

6
user1681048

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

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

Comme l'ont souligné d'autres contributeurs, ceux-ci sont désactivés par défaut pour des raisons de sécurité. Astuce utile - lors de la configuration de votre site, il est pratique d’effectuer une commutation pour vos différents environnements afin que ces erreurs soient activées par défaut dans vos environnements locaux et de développement. Ceci peut être réalisé avec le code suivant (idéalement dans votre fichier index.php ou config afin qu'il soit 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;
}
6
Code Synthesis

FirePHP peut aussi être utile.

6
Rich Bradshaw

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

Sudo tail -50f /var/log/Apache2/error.log

où il affichera les 50 dernières erreurs. Il existe un fichier d'erreur error.log pour Apache2 qui enregistre toutes les erreurs.

5
Ashutosh Jha

Pour activer le rapport d'erreur complet, ajoutez ceci à votre script:

error_reporting(E_ALL);

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

ini_set('display_errors', '1');

Forcera l'affichage des erreurs. Cela devrait être désactivé dans les serveurs de production, mais pas lorsque vous développez.

4

Vous pouvez activer le rapport d'erreur complet (y compris les avis et les messages stricts). Certaines personnes trouvent cela trop verbeux, mais ça vaut le coup d'essayer. Définissez error_reporting sur E_ALL | E_STRICT dans votre fichier 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 message 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"
4
Ayman Hourieh

Les "ERREURS" sont les éléments les plus utiles pour permettre aux développeurs de connaître leurs erreurs et de les résoudre pour que le système fonctionne parfaitement.

PHP fournit de meilleurs moyens de savoir pourquoi et où leur morceau de code génère des erreurs. Par conséquent, en connaissant ces erreurs, les développeurs peuvent améliorer leur code de nombreuses façons.

Meilleure façon 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 des outils de débogage comme xdebug dans votre IDE.

3
user3176739

Outre le paramètre error_reporting et 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 vois un écran vide, le fichier journal devient obsolète et mon éditeur me demande si je souhaite le recharger. Lorsque je le fais, je saute au bas et il y a une 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
3
jmucchiello

Cette réponse vous est apportée par le département du département des licenciements.

  1. ini_set()/php.ini/.htaccess/.user.ini

    Les paramètres _display_errors_ et _error_reporting_ ont été suffisamment couverts. Mais juste pour récapituler quand utiliser quelle option:

    • ini_set() et error_reporting() s'appliquent uniquement aux erreurs d'exécution.
    • php.ini doit principalement être modifié pour les configurations de développement. (La version du serveur Web et de la CLI a souvent un php.ini différent)
    • .htaccess les drapeaux ne fonctionnent que pour les configurations datées (Trouvez un nouvel hébergeur! Les serveurs bien gérés coûtent moins cher.)
    • .user.ini sont des php.ini partiels pour les configurations modernes (FCGI/FPM)

    Et comme alternative brute aux erreurs d’exécution, vous pouvez souvent utiliser:

    _set_error_handler("var_dump");   // ignores error_reporting and `@` suppression
    _
  2. error_get_last()

    Peut être utilisé pour récupérer le dernier avis/avertissement/erreur au moment de l'exécution, lorsque message_erreur est désactivé.

  3. $php_errormsg

    Est une variable superlocal, qui contient également le dernier message d'exécution PHP.

  4. isset() Begone!

    Je sais que cela va déplaire à beaucoup de gens, mais isset et empty devrait pas être utilisé par les nouveaux arrivants. Vous pouvez ajouter la suppression de la notification après après avoir vérifié que votre code fonctionnait. Mais jamais auparavant.

    Un grand nombre des questions "quelque chose ne fonctionne pas" que nous recevons récemment sont le résultat de fautes de frappe telles que:

    _if(isset($_POST['sumbit']))
    #                  ↑↑
    _

    Vous ne recevrez aucun avis utile si votre code est jonché de isset/empty/_array_keys_exists_. C'est parfois plus il est judicieux d'utiliser _@_ , donc les avis et les avertissements vont au moins dans les journaux.

  5. assert_options(ASSERT_ACTIVE|ASSERT_WARNING);

    Pour obtenir des avertissements pour les sections assert(). (Assez rare, mais un code plus compétent pourrait en contenir.)

    PHP7 requiert zend.assertions=1 dans le fichier php.ini également.

  6. declare(strict_types=1);

    Plier PHP dans un langage strictement typé ne résoudra pas beaucoup d'erreurs de logique, mais il s'agit certainement d'une option à des fins de débogage.

  7. PDO/MySQLi

    Et @Phil déjà mentionné rapport d'erreurs PDO/MySQLi options. Des options similaires existent bien sûr pour d'autres API de base de données.

  8. json_last_error() + json_last_error_msg

    Pour l'analyse JSON.

  9. preg_last_error()

    Pour regexen.

  10. CURLOPT_VERBOSE

    Pour déboguer des demandes de curl, vous avez besoin au minimum de CURLOPT_VERBOSE.

  11. Shell/exec()

    De même, l'exécution de la commande Shell ne générera pas d'erreurs par elle-même. Vous avez toujours besoin de _2>&1_ et jetez un coup d'œil au $ errno.

1
mario

En plus de toutes les merveilleuses réponses ici, je voudrais ajouter une mention spéciale pour les bibliothèques MySQLi et PDO.

Afin de...

  1. Toujours voir les erreurs liées à la base de données, et
  2. Évitez de vérifier les types de retour pour les méthodes pour voir si quelque chose s'est mal passé

La meilleure option est de configurer les bibliothèques sur lever des exceptions .

MySQLi

Ajoutez ceci près du haut de votre script

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

Ceci est mieux placé avant d’utiliser new mysqli() ou mysqli_connect().

AOP

Définissez l'attribut PDO::ATTR_ERRMODE sur PDO::ERRMODE_EXCEPTION sur votre instance de connexion. Vous pouvez le faire dans le constructeur

$pdo = new PDO('driver:Host=localhost;...', 'username', 'password', [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);

ou après la création

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
1
Phil

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

0
siniradam

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

0
PHPCoder

Activer le signalement des erreurs est la bonne solution, mais cela ne semble pas prendre effet dans le programme qui l’active, mais seulement 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 courante (c.-à-d. Activer le rapport d'erreur) et qui inclut également la page que je souhaite réellement appel.

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

One - Créez le fichier genwrap.php et mettez-y ce code:

<?php
error_reporting(-1);
ini_set('display_errors', 'On');

include($_REQUEST['page']);
?>

Deux - changez le lien vers le programme/la page que vous voulez déboguer 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) { /* ... */
0
kris

Outre les très nombreuses excellentes réponses ci-dessus, vous pouvez également implémenter les deux fonctions suivantes dans vos projets. Ils intercepteront toutes les erreurs non syntaxiques avant la fermeture de l'application/script. Dans les fonctions, vous pouvez effectuer une trace de la piste et consigner ou rendre au public un message agréable indiquant que le site est en maintenance.

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

Retracer:

debug_backtrace

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

0
Vladimir Ramik