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?
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/
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');
cette option remplace les paramètres par défaut de php.ini, qui font simplement PHP signaler les erreurs au journal.
Configuration PHP
2 entrées dans php.ini dicte la sortie des erreurs:
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.
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:
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.
en haut de la page choisissez un paramètre
error_reporting(E_ERROR | E_WARNING | E_PARSE);
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
je recommande Nette Tracy pour une meilleure visualisation des erreurs et des exceptions en PHP:
error_reporting(E_ALL | E_STRICT);
et activer les erreurs d'affichage en php.ini
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');
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.
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.
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;
}
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.
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
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"
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.
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
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.
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¶m=val').done(function(data) { /* ... */
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.
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
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
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...
- toujours voir les erreurs liées à la base de données, et
- é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);
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);
}
?>