Comment obtenir des messages d'erreur utiles en PHP?

je trouve la programmation en PHP assez frustrante. Très souvent, je vais essayer et exécuter le script et juste obtenir un écran blanc de retour. Pas de message d'erreur, juste un écran vide. La cause pourrait avoir été une simple erreur de syntaxe (crochet erroné, point-virgule manquant), ou un appel de fonction échoué, ou quelque chose d'autre entièrement.

Il est très difficile de comprendre ce qui s'est passé. Je finis par Commenter le code, en entrant des déclarations" echo " partout, etc. qui cherchent à réduire le problème. Mais il doit y avoir un meilleur moyen, non?.

alors, y a-t-il un moyen pour que PHP produise un message d'erreur utile comme Java le fait? Est-ce que quelqu'un peut recommander de bons conseils, outils et techniques de débogage PHP?

498
demandé sur Taryn 2009-05-10 13:48:12

29 réponses

Pour les erreurs de syntaxe, vous devez activer l'affichage des erreurs dans le php.ini. Par défaut, ils sont désactivés parce que vous ne voulez pas qu'un "client" voie les messages d'erreur. consultez cette page dans la documentation PHP pour des informations sur les 2 directives: error_reporting et display_errors . display_errors est probablement celui que vous voulez modifier. Si vous ne pouvez pas modifier le php.ini, vous pouvez également ajouter 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 (comme mentionné par Gumbo) pour votre version de PHP pour error_reporting pour obtenir toutes les erreurs. plus d'information

3 autres éléments: (1) vous pouvez vérifier le fichier journal des erreurs car il contient 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 est d'utiliser un éditeur qui vérifie les erreurs quand vous tapez, comme 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 de sorte que vous utilisez 1 programme pour tout faire.)

Cartman lien est aussi très bon: http://www.ibm.com/developerworks/library/os-debug/

448
répondu Darryl Hein 2015-10-10 12:27:57

permet toutes les erreurs:

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

Voir aussi les liens suivants

422
répondu Eljakim 2016-05-09 22:25:08

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

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

cette option remplace les paramètres par défaut de php.ini, qui font simplement PHP signaler les erreurs au journal.

52
répondu Tomalak 2009-05-10 09:54:31

Configuration PHP

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

  1. display_errors
  2. error_reporting

Dans production , display_errors est généralement définie à Off (Qui est un bonne chose, parce que l'affichage d'erreur dans les sites de production n'est généralement pas souhaitable!).

Cependant, dans développement , il doit être mis à On , de sorte que les erreurs s'affichent. Vérifier !

error_reporting (à partir de PHP 5.3) est défini par défaut à E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED (ce qui signifie que tout est affiché sauf pour les notices, les normes strictes et les notices d'imprécision). Dans le doute, mettez E_ALL à afficher toutes les erreurs. Vérifier !

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

c'est dommage. Habituellement, les hôtes partagés n'autorisent pas la modification de leur php.fichier ini, et donc, cette option est malheureusement indisponible. Mais n'ayez pas peur! Nous avons d'autres options!

configuration de Runtime

dans le script désiré, nous pouvons modifier le php.entrées ini dans d'exécution! Sens, ça va fonctionner lorsque le script s'exécute! Sweet!

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

ces deux lignes feront le même effet que la modification du php.entrées ini comme ci-dessus! Génial!

j'obtiens toujours une page blanche/erreur 500!

ça veut dire que le script n'avait même pas couru! Cela arrive généralement quand vous avez une erreur de syntaxe!

avec des erreurs de syntaxe, le script n'arrive même pas à exécuter. Il échoue à compilez le temps , ce qui signifie qu'il utilisera les valeurs en php.ini, qui, si vous n'avait pas changé, peut ne pas permettre l'affichage des erreurs.

journaux d'Erreur

en plus, PHP par défaut enregistre les erreurs. Dans l'hébergement partagé, il peut être dans un dossier dédié ou sur le même dossier que le script incriminé.

Si vous avez accès à php.ini, vous pouvez le trouver sous le error_log entrée.

47
répondu Madara Uchiha 2017-05-23 11:33:26

il y a une extension vraiment utile appelée " xdebug " qui rendra vos rapports beaucoup plus agréables aussi bien.

26
répondu gnarf 2009-05-10 09:59:30

pour un dépannage rapide et pratique, je suggère ici:

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

à mettre au début du script qui est sous trouble-shooting. Ce n'est pas parfait, la variante parfaite est que vous activez aussi cela dans le php.ini et que vous enregistrez les erreurs dans PHP pour attraper les erreurs de syntaxe et de démarrage.

les paramètres décrits ici affichent toutes les erreurs, les notices et les Avertissements, y compris les plus stricts, quel que soit le PHP version.

à Côté de choses à prendre en considération:

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

Voir aussi:

22
répondu hakre 2013-01-24 15:18:06

si vous êtes super cool, vous pourriez 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 n'affichera les erreurs que lorsque vous exécutez localement. Il vous donne également la variable test_server à utiliser dans d'autres endroits le cas échéant.

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

15
répondu Rich Bradshaw 2011-07-04 19:49:30

en haut de la page choisissez un paramètre

error_reporting(E_ERROR | E_WARNING | E_PARSE);
14
répondu Kld 2013-05-06 14:14:25

pour persister cela et le rendre conforme, vous pouvez éditer votre php.fichier ini. Il est habituellement stocké dans /etc/php.ini ou /etc/php/php.ini , mais plus local php.ini 's peuvent l'écraser, en fonction des directives de configuration de votre fournisseur d'hébergement. Vérifiez un fichier phpinfo() pour Loaded Configuration File en haut, pour être sûr lequel est chargé en dernier.

rechercher display_errors dans ce fichier. Il ne devrait y avoir que 3 cas, dont 2 sont commentés.

Changer la ligne non complétée en:

display_errors = stdout
12
répondu Ram 2016-07-16 07:46:55
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 .

11
répondu Yan.Zero 2016-05-09 22:26:07

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

Nette Tracy screenshot

10
répondu Ondřej Šotek 2016-05-09 23:41:16
error_reporting(E_ALL | E_STRICT);

et activer les erreurs d'affichage en php.ini

8
répondu Ólafur Waage 2009-05-10 09:54:53

vous pouvez enregistrer votre propre gestionnaire d'erreurs en PHP. Le fait de transférer toutes les erreurs dans un fichier peut vous aider dans ces cas obscurs, par exemple. Notez que votre fonction sera appelée, peu importe ce que votre 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');
7
répondu soulmerge 2009-05-10 09:54:10

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

6
répondu Rodney McIntosh 2012-11-25 13:30:20

vous pourriez aussi vouloir essayer PHPStorm comme votre éditeur de code. Il trouvera beaucoup de PHP et d'autres erreurs de syntaxe juste pendant que vous tapez dans l'éditeur.

6
répondu user1681048 2014-06-18 01:03:15

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

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

comme l'ont souligné d'autres contributeurs, ils sont désactivés par défaut pour des raisons de sécurité. Comme un conseil utile - lorsque vous mettez en place votre site, il est pratique de faire un commutateur pour vos différents environnements de sorte que ces erreurs sont allumé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 index.php ou fichier de configuration so c'est actif depuis 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
répondu Code Synthesis 2016-03-24 14:57:42

FirePHP peut également être utile.

5
répondu Rich Bradshaw 2009-05-10 10:21:42

si vous êtes un utilisateur ubuntu, allez sur votre terminal et exécutez 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.

5
répondu Ashutosh Jha 2014-11-10 11:43:08
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
4
répondu Abuzer Firdousi 2017-12-04 20:54:29

vous pouvez activer la notification complète des erreurs (y compris les notices et les messages stricts). Certaines personnes trouvent cela trop verbeux, mais il vaut la peine d'essayer. Mettez error_reporting à E_ALL | E_STRICT dans votre php.ini.

error_reporting = E_ALL | E_STRICT

E_STRICT vous informera sur les fonctions obsolètes et vous donnera des recommandations sur 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

S'assure également que display_errors est activé en php.ini. Si votre version PHP est plus ancienne que 5.2.4, définissez-la à On :

display_errors = "On"

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

display_errors = "stderr"
3
répondu Ayman Hourieh 2009-05-10 10:04:56

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

error_reporting(E_ALL);

cela provoque même des avertissements minimes à apparaître. Et, juste au cas:

ini_set('display_errors', '1');
"151920920 Va" forcer l'affichage des erreurs. Cela devrait être désactivé dans les serveurs de production, mais pas lorsque vous développez.

3
répondu Daniel S 2009-05-10 12:09:01

mis à part error_reporting et le paramètre display_errors ini, vous pouvez obtenir des erreurs de syntaxe à 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 j'obtiens un écran blanc, le fichier journal devient périmé 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
3
répondu jmucchiello 2009-05-10 18:16:21

Les "ERREURS" sont les plus utiles pour les développeurs de connaître leurs erreurs et résolu à rendre le système de travail parfait.

PHP fournit quelques - unes des meilleures façons de savoir les développeurs pourquoi et où leur morceau de code obtient les erreurs, donc en connaissant ces développeurs d'erreurs peuvent rendre leur code mieux à de nombreux égards.

meilleure façon d'écrire les deux lignes suivantes sur le haut du script pour obtenir tous les messages d'erreurs:

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

une autre façon d'utiliser les outils de débogage comme xdebug dans votre IDE.

3
répondu janykste 2016-05-09 22:45:11

activer le rapport d'erreur est la bonne solution, mais il ne semble pas prendre effet dans le programme qui l'allume, 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 populaire ici (ie. turn on error reporting) et il inclut également la page que je veux appeler.

il y a 2 étapes à suivre 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 - changez le lien vers le programme/page que vous souhaitez déboguer pour aller via genwrap.php,

par exemple: modification:

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

à

$.ajax('dir/genwrap.php?page=pgm.php&param=val').done(function(data) { /* ... */
0
répondu kris 2013-06-15 11:55:04

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

0
répondu PHPCoder 2014-10-01 19:48:54

en plus des très nombreuses excellentes réponses ci-dessus, vous pouvez également mettre en œuvre les deux fonctions suivantes dans vos projets. Ils attraperont chaque erreur non-syntaxique avant application / script exit. À l'intérieur des fonctions, vous pouvez faire un backtrace et log ou rendre un site agréable "est sous maintenance" message au public.

Erreurs Fatales:

register_shutdown_function

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

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

0
répondu Vladimir Ramik 2015-03-07 18:16:51

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

0
répondu siniradam 2018-08-06 23:11:57

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

afin de...

  1. toujours voir les erreurs liées à la base de données, et
  2. éviter de vérifier les types de retour pour les méthodes pour voir si quelque chose a mal tourné

la meilleure option est de configurer les bibliothèques à throw exceptions .

MySQLi

Ajouter près du haut de votre script

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

ceci est le mieux placé avant d'utiliser new mysqli() ou mysqli_connect() .

PDO

définit l'attribut PDO::ATTR_ERRMODE à PDO::ERRMODE_EXCEPTION sur votre instance de connexion. Vous pouvez soit 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);
0
répondu Phil 2018-09-14 03:31:55

mon problème habituel sont" petites, stupides " erreurs d'analyseur qui malheureusement ne se présentent pas.

Toutefois, lorsqu'un .PHP-Fichier comprend un fichier qui a l'analyseur, des erreurs, elles sont présentées! J'ai donc eu l'idée d'écrire un petit "executor-script" qui est lancé avec le nom du fichier buggy comme argument, i.e. example.com/sx.php?sc=buggy.php

il m'avait déjà sauvé de beaucoup de maux de tête, peut-être qu'il sera utile à 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==stripos('.php',$sc)) $sc.='.php';  // adjust this if your preferred extension is php5!
    require($sc);
}
?>
-1
répondu MBaas 2013-07-09 18:05:23