script - value=<? php echo




Comment obtenir des messages d'erreur utiles en PHP? (19)

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 quelque chose d'autre entièrement.

Il est très difficile de comprendre ce qui s'est mal passé. Je finis par commenter le code, en entrant des déclarations "d'écho" partout, etc. essayant d'affiner le problème. Mais il doit sûrement y avoir un meilleur moyen, non?

Alors, y a-t-il un moyen d'obtenir PHP pour produire un message d'erreur utile comme le fait Java? Quelqu'un peut-il recommander de bons conseils, outils et techniques de débogage PHP?


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 sur les sites de production n'est généralement pas souhaitable!).

Cependant, en développement , il doit être activé, 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 pour les notifications, les normes strictes et les avis de désapprobation). En cas de doute, définissez-le sur E_ALL pour afficher toutes les erreurs. Vérifiez !

Whoa whoa! Pas de vérification! Je ne peux pas changer mon php.ini!

C'est une honte. Les hôtes habituellement partagés n'autorisent pas la modification de leur fichier php.ini, et donc, cette option est malheureusement indisponible. Mais n'ayez pas peur! Nous avons d'autres options!

Configuration d'exécution

Dans le script souhaité, nous pouvons modifier les entrées php.ini en cours d'exécution! Ce qui veut dire que ça va tourner quand le script sera lancé! Doux!

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

Ces deux lignes auront le même effet que la modification des entrées php.ini comme ci-dessus! Impressionnant!

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

Cela signifie que le script n'a même pas fonctionné! Cela arrive généralement quand vous avez une erreur de syntaxe!

Avec des erreurs de syntaxe, le script n'est même pas exécuté. Il échoue au moment de la compilation , ce qui signifie qu'il utilisera les valeurs de php.ini, qui, si vous n'avez pas changé, peut ne pas permettre l'affichage d'erreurs.

Journaux d'erreur

En outre, PHP enregistre par défaut les erreurs. En hébergement partagé, il peut être dans un dossier dédié ou dans le même dossier que le script incriminé.

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


Activer le signalement d'erreurs est la bonne solution, mais elle ne semble pas entrer en vigueur dans le programme qui l'active, mais uniquement dans les programmes ultérieurs.

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'est-à-dire activer le rapport d'erreurs) et il inclut également la page que je veux réellement appel.

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

Un - créer genwrap.php et mettre ce code dedans:

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

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

Deux - changer le lien vers le programme / la page que vous voulez déboguer pour aller via genwrap.php,

Par exemple: changer:

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

à

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

En haut de la page, choisissez un paramètre

error_reporting(E_ERROR | E_WARNING | E_PARSE);

En plus des très nombreuses excellentes réponses ci-dessus, vous pouvez également implémenter les deux fonctions suivantes dans vos projets. Ils verront toutes les erreurs non syntaxiques avant la sortie de l'application / du script. À l'intérieur des fonctions, vous pouvez faire un backtrace et enregistrer ou rendre un message agréable «Site est sous 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


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


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


Les deux lignes principales dont vous avez besoin pour obtenir des erreurs utiles de PHP sont:

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

Comme indiqué par d'autres contributeurs, ceux-ci sont désactivés par défaut pour des raisons de sécurité. Un conseil utile: lorsque vous configurez votre site, il est pratique de basculer vers 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 donc 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;
}

Mis à part error_reporting et le paramètre ini display_errors, vous pouvez obtenir des erreurs SYNTAX à partir des fichiers journaux de votre serveur Web. Quand je développe PHP, je charge les logs de mon serveur de développement dans mon éditeur. Chaque fois que je teste une page et que j'obtiens un écran vide, le fichier journal devient obsolète et mon éditeur me demande si je veux le recharger. Quand je 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

Pour activer le rapport d'erreurs complet, ajoutez-le à votre script:

error_reporting(E_ALL);

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

ini_set('display_errors', '1');

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


Pour les erreurs de syntaxe, vous devez activer l'affichage des erreurs dans 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 deux directives: error_reporting et display_errors . display_errors est probablement celui que vous voulez changer. 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 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'informations

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 consiste à utiliser un éditeur qui vérifie les erreurs lorsque vous tapez, 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 de sorte que vous utilisez 1 programme pour tout faire.)

Le link de Cartman est également très bon: link


Pour un dépannage rapide et pratique, je suggère normalement ici 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'activez aussi dans php.ini et que vous consignez les erreurs dans PHP pour attraper la syntaxe et les erreurs de démarrage.

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

Prochaines choses à considérer:

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

Voir aussi:


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 seulement des erreurs quand 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 que le script s'exécute ne seront pas détectées, mais pour 99% des erreurs que je fais, ce n'est pas un problème.


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


Vous pouvez également essayer PHPStorm comme éditeur de code. Il trouvera de nombreuses erreurs de syntaxe PHP et autres au fur et à mesure que vous tapez dans l'éditeur.


Vous pouvez enregistrer votre propre gestionnaire d'erreur en PHP. Enlever toutes les erreurs dans un fichier peut vous aider dans ces cas obscurs, par exemple. Notez que votre fonction sera appelée, quelle que soit la valeur de votre error_reporting actuelle. 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');

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, qui font que PHP signale les erreurs au journal.



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

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


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






error-handling