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

May 10 2009

Très souvent, je vais essayer d'exécuter un script PHP et simplement récupérer un écran vide. Aucun message d'erreur; juste un écran vide. La cause peut être une simple erreur de syntaxe (crochet incorrect, point-virgule manquant), un appel de fonction échoué, ou autre chose.

Il est très difficile de comprendre ce qui n'a pas fonctionné. Je finis par commenter le code, entrer des déclarations «écho» partout, etc. en essayant de réduire le problème. Mais il doit sûrement y avoir un meilleur moyen, non?

Existe-t-il un moyen pour que PHP produise un message d'erreur utile, comme le fait Java?

Réponses

510 DarrylHein May 10 2009 at 16:52

Pour les erreurs de syntaxe, vous devez activer l'affichage des erreurs dans le 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 de la documentation PHP pour obtenir des informations sur les 2 directives: error_reportinget display_errors. display_errorsest probablement celui que vous souhaitez changer. 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_reportingobtenir 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, 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, vous utilisez donc 1 programme pour tout faire.)

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

458 Eljakim Jul 05 2011 at 02:46

Ce qui suit active toutes les erreurs:

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

Voir également les liens suivants

  • http://php.net/manual/en/errorfunc.configuration.php#ini.display-errors
  • http://php.net/manual/en/errorfunc.configuration.php#ini.display-startup-errors
  • http://php.net/manual/en/function.error-reporting.php
176 m4dm4x1337 Aug 13 2013 at 18:59

Le code suivant doit afficher toutes les erreurs:

<?php

// ----------------------------------------------------------------------------------------------------
// - Display Errors
// ----------------------------------------------------------------------------------------------------
ini_set('display_errors', 'On');
ini_set('html_errors', 0);

// ----------------------------------------------------------------------------------------------------
// - Error Reporting
// ----------------------------------------------------------------------------------------------------
error_reporting(-1);

// ----------------------------------------------------------------------------------------------------
// - Shutdown Handler
// ----------------------------------------------------------------------------------------------------
function ShutdownHandler()
{
    if(@is_array($error = @error_get_last())) { return(@call_user_func_array('ErrorHandler', $error));
    };

    return(TRUE);
};

register_shutdown_function('ShutdownHandler');

// ----------------------------------------------------------------------------------------------------
// - Error Handler
// ----------------------------------------------------------------------------------------------------
function ErrorHandler($type, $message, $file, $line)
{
    $_ERRORS = Array( 0x0001 => 'E_ERROR', 0x0002 => 'E_WARNING', 0x0004 => 'E_PARSE', 0x0008 => 'E_NOTICE', 0x0010 => 'E_CORE_ERROR', 0x0020 => 'E_CORE_WARNING', 0x0040 => 'E_COMPILE_ERROR', 0x0080 => 'E_COMPILE_WARNING', 0x0100 => 'E_USER_ERROR', 0x0200 => 'E_USER_WARNING', 0x0400 => 'E_USER_NOTICE', 0x0800 => 'E_STRICT', 0x1000 => 'E_RECOVERABLE_ERROR', 0x2000 => 'E_DEPRECATED', 0x4000 => 'E_USER_DEPRECATED' ); if(!@is_string($name = @array_search($type, @array_flip($_ERRORS))))
    {
        $name = 'E_UNKNOWN'; }; return(print(@sprintf("%s Error in file \xBB%s\xAB at line %d: %s\n", $name, @basename($file), $line, $message))); }; $old_error_handler = set_error_handler("ErrorHandler");

// other php code

?>

La seule façon de générer une page vierge avec ce code est lorsque vous avez une erreur dans le gestionnaire d'arrêt. J'ai copié et collé ceci à partir de mes propres cms sans le tester, mais je suis sûr que cela fonctionne.

61 Tomalak May 10 2009 at 16:54

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 obligent simplement PHP à signaler les erreurs au journal.

61 JamesAnderson Sep 25 2009 at 11:22

Les erreurs et les avertissements apparaissent généralement dans ....\logs\php_error.logou en ....\logs\apache_error.logfonction de vos paramètres php.ini.

Les erreurs utiles sont également souvent dirigées vers le navigateur, mais comme elles ne sont pas du code HTML valide, elles ne sont pas affichées.

Donc, "tail -f"vos fichiers journaux et lorsque vous obtenez un écran vide, utilisez les options de menu" vue "->" source "d'IE pour afficher la sortie brute.

55 Madara'sGhost Feb 03 2014 at 03:47

Configuration PHP

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

  1. display_errors
  2. error_reporting

En production , display_errorsest généralement réglé 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 défini sur On, afin que les erreurs s'affichent. 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 avis, des normes strictes et des avis d'obsolescence). En cas de doute, réglez-le sur E_ALLpour 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 n'autorisent pas la modification de leur fichier php.ini, et cette option n'est donc malheureusement pas disponible. Mais n'ayez crainte! Nous avons d' autres options !

Configuration d'exécution

Dans le script souhaité, nous pouvons modifier les entrées php.ini au runtime! Cela signifie qu'il s'exécutera lorsque le script s'exécutera! Doux!

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

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

J'obtiens toujours une page vierge / erreur 500!

Cela signifie que le script ne s'était même pas 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 de php.ini, qui si vous n'avez pas changé, peuvent ne pas permettre l'affichage des erreurs.

Journaux d'erreurs

De plus, PHP par défaut enregistre les erreurs. Dans l'hébergement mutualisé, il peut se trouver 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 l' error_logentrée.

31 FDisk Sep 25 2009 at 14:48

J'utilise toujours cette syntaxe tout en haut du script php.

ini_set('error_reporting', E_ALL);
ini_set('display_errors', 'On');  //On or Off
30 gnarf May 10 2009 at 16:59

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

27 hakre Jan 24 2013 at 22:06

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

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

à placer au début du script en cours de dépannage. Ce n'est pas parfait, la variante parfaite est que vous activez également cela dans php.iniet que vous consignez les erreurs en PHP pour détecter les erreurs de syntaxe et de démarrage.

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

Points suivants à considérer:

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

Voir aussi:

  • Rapport d'erreurs (PHP dans le bon sens.)
  • Documentation sur les constantes prédéfinies
  • error_reporting()Docs
  • display_errorsDocs
27 EduardoOliveira Jan 06 2016 at 01:59

Il est possible d'enregistrer un hook pour rendre visible la dernière erreur ou avertissement.

function shutdown(){
  var_dump(error_get_last());
}

register_shutdown_function('shutdown');

l'ajout de ce code au début de votre index.php vous aidera à déboguer les problèmes.

17 RichBradshaw Jul 05 2011 at 02:49

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

17 Kld May 06 2013 at 21:14

En haut de la page, choisissez un paramètre

error_reporting(E_ERROR | E_WARNING | E_PARSE);
17 Sherif Nov 12 2015 at 13:24

C'est un problème de configuration chargée par rapport à la configuration d'exécution

Il est important de reconnaître qu'une erreur de syntaxe ou une erreur d'analyse se produit pendant l' étape de compilation ou d' analyse , ce qui signifie que PHP se libèrera avant même d'avoir eu la chance d'exécuter l'un de vos codes. Donc, si vous modifiez la display_errorsconfiguration de PHP pendant l'exécution (cela inclut tout ce qui va de l'utilisation ini_setdans votre code à l'utilisation de .htaccess, qui est un fichier de configuration d'exécution), seuls les paramètres de configuration chargés par défaut sont en jeu.

Comment toujours éviter WSOD en développement

Pour éviter un WSOD vous voulez vous assurer que votre fichier de configuration chargé a display_errorssur et error_reportingmis à -1(c'est l'équivalent E_ALL car il assure tous les bits sont activés quelle que soit la version de PHP que vous utilisez ). Ne codez pas en dur la valeur constante de E_ALL, car cette valeur est sujette à changement entre les différentes versions de PHP.

La configuration chargée est soit votre php.inifichier chargé, soit votre fichier apache.confor httpd.confou virtualhost. Ces fichiers ne sont lus qu'une seule fois lors de la phase de démarrage (lorsque vous démarrez pour la première fois apache httpd ou php-fpm, par exemple) et ne sont remplacés que par les modifications de la configuration d'exécution. S'assurer que display_errors = 1et error_reporting = -1dans votre fichier de configuration chargé garantit que vous ne verrez jamais un WSOD indépendamment de la syntaxe ou de l'erreur d'analyse qui se produit avant un changement d'exécution comme ini_set('display_errors', 1);ou error_reporting(E_ALL);peut avoir lieu.

Comment trouver vos fichiers de configuration chargés (php.ini)

Pour localiser vos fichiers de configuration chargés, créez simplement un nouveau fichier PHP avec uniquement le code suivant ...

<?php
phpinfo();

Puis pointez votre navigateur là-bas et regardez le fichier de configuration chargé et les fichiers .ini supplémentaires analysés , qui se trouvent généralement en haut de votre fichier et phpinfo()incluront le chemin absolu vers tous vos fichiers de configuration chargés.

Si vous voyez à la (none)place du fichier, cela signifie que vous n'avez pas de php.ini dans le chemin du fichier de configuration (php.ini) . Vous pouvez donc télécharger le stock php.ini fourni avec PHP à partir d'ici et le copier dans le chemin de votre fichier de configuration en tant que php.ini, puis assurez-vous que votre utilisateur php dispose des autorisations suffisantes pour lire ce fichier. Vous devrez redémarrer httpd ou php-fpm pour le charger. N'oubliez pas qu'il s'agit du fichier de développement php.ini fourni avec la source PHP. Alors ne l'utilisez pas en production!


Ne fais pas ça en production

C'est vraiment le meilleur moyen d'éviter un WSOD en développement. Quiconque suggère que vous mettez ini_set('display_errors', 1);ou error_reporting(E_ALL);en haut de votre script PHP ou en utilisant .htaccess comme vous l'avez fait ici, ne vous aidera pas à éviter un WSOD lorsqu'une erreur de syntaxe ou d'analyse se produit (comme dans votre cas ici) si votre fichier de configuration chargé a display_errorsdésactivé.

De nombreuses personnes (et les installations de base de PHP) utiliseront un fichier ini de production qui a display_errorsété désactivé par défaut, ce qui entraîne généralement la même frustration que vous avez vécue ici. Parce que PHP l'a déjà désactivé au démarrage, il rencontre alors une erreur de syntaxe ou d'analyse et des bails sans rien à afficher. Vous vous attendez à ce que ini_set('display_errors',1);le haut de votre script PHP ait dû éviter cela, mais peu importe si PHP ne peut pas analyser votre code car il n'aura jamais atteint le runtime.

16 Ram Jul 05 2011 at 02:54

Pour persister et le rendre confortable, vous pouvez éditer votre fichier php.ini. Il est généralement stocké dans /etc/php.iniou /etc/php/php.ini, mais des fichiers plus locaux php.inipeuvent le remplacer, selon les directives de configuration de votre fournisseur d'hébergement. Vérifiez un phpinfo()fichier pour Loaded Configuration Fileen haut, pour être sûr de celui qui est chargé en dernier.

Recherchez display_errors 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
16 Eli Sep 25 2009 at 15:09

Je ne sais pas si cela peut vous aider, mais voici un morceau de mon fichier de configuration standard pour les projets php. J'ai tendance à ne pas trop dépendre des configurations d'Apache même sur mon propre serveur.

Je n'ai jamais le problème des erreurs qui disparaissent, alors peut-être que quelque chose ici vous donnera une idée.

Modifié pour afficher APPLICATON_LIVE

/*
APPLICATION_LIVE will be used in process to tell if we are in a development or production environment.  It's generally set as early as possible (often the first code to run), before any config, url routing, etc.
*/

if ( preg_match( "%^(www.)?livedomain.com$%", $_SERVER["HTTP_HOST"]) ) {
    define('APPLICATION_LIVE', true);
} elseif ( preg_match( "%^(www.)?devdomain.net$%", $_SERVER["HTTP_HOST"]) ) {
    define('APPLICATION_LIVE', false);
} else {
    die("INVALID HOST REQUEST (".$_SERVER["HTTP_HOST"].")");
    // Log or take other appropriate action.
}


/*
--------------------------------------------------------------------
DEFAULT ERROR HANDLING
--------------------------------------------------------------------
Default error logging.  Some of these may be changed later based on APPLICATION_LIVE.
*/
error_reporting(E_ALL & ~E_STRICT);
ini_set ( "display_errors", "0");
ini_set ( "display_startup_errors", "0");
ini_set ( "log_errors", 1);
ini_set ( "log_errors_max_len", 0);
ini_set ( "error_log", APPLICATION_ROOT."logs/php_error_log.txt");
ini_set ( "display_errors", "0");
ini_set ( "display_startup_errors", "0");

if ( ! APPLICATION_LIVE ) {
    // A few changes to error handling for development.
    // We will want errors to be visible during development.
    ini_set ( "display_errors", "1");
    ini_set ( "display_startup_errors", "1");
    ini_set ( "html_errors", "1");
    ini_set ( "docref_root", "http://www.php.net/");
    ini_set ( "error_prepend_string", "<div style='color:red; font-family:verdana; border:1px solid red; padding:5px;'>");
    ini_set ( "error_append_string", "</div>");
}
15 Yan.Zero Aug 19 2014 at 22:36
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 .

15 OndřejŠotek Jul 16 2015 at 05:38

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

15 AbuzerFirdousi Dec 05 2017 at 03:54
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
10 ÓlafurWaage May 10 2009 at 16:54
error_reporting(E_ALL | E_STRICT);

Et activez les erreurs d'affichage dans php.ini

9 soulmerge May 10 2009 at 16:54

Vous pouvez enregistrer votre propre gestionnaire d'erreurs en PHP. Le vidage de 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 rapport d' erreur actuel . 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 CodeSynthesis Jun 10 2014 at 20:37

Les deux lignes clés 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é. Comme 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 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 RichBradshaw May 10 2009 at 17:21

FirePHP peut également être utile.

6 user577803 Jan 17 2011 at 03:59

ouvrez votre php.ini, assurez-vous qu'il est défini sur:

display_errors = On

redémarrez votre serveur.

6 user1681048 Jun 18 2014 at 08:03

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

6 AshutoshJha Nov 10 2014 at 18:23

si vous êtes un utilisateur ubuntu, accédez à votre terminal et exécutez cette commande

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

où il affichera 50 erreurs récentes. Il existe un fichier d'erreur error.logpour apache2 qui enregistre toutes les erreurs.

5 DanielSorichetti May 10 2009 at 19:09

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

error_reporting(E_ALL);

Cela provoque même l'apparition d'avertissements minimes. Et, juste au cas où:

ini_set('display_errors', '1');

Force l'affichage des erreurs. Cela doit être désactivé sur les serveurs de production, mais pas lorsque vous développez.

5 Noname Feb 01 2014 at 13:24

Les «ERREURS» sont les choses les plus utiles pour que les développeurs connaissent leurs erreurs et les résolvent pour que le système fonctionne parfaitement.

PHP fournit quelques-uns des meilleurs moyens de savoir aux développeurs pourquoi et où leur morceau de code obtient les erreurs, donc en connaissant ces erreurs, les développeurs peuvent améliorer leur code de plusieurs manières.

Meilleures façons d'écrire en suivant deux lignes 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.

4 AymanHourieh May 10 2009 at 16:58

Vous pouvez activer le rapport d'erreur complet (y compris les avis et les messages stricts). Certaines personnes trouvent cela trop verbeux, mais cela vaut la peine d'essayer. Mettre error_reportingà E_ALL | E_STRICTvotre php.ini.

error_reporting = E_ALL | E_STRICT

E_STRICT vous informera des 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

Assurez-vous également que cela display_errorsest activé dans php.ini. Si votre version de PHP est antérieure à la version 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 jmucchiello May 11 2009 at 01:16

En plus du paramètre error_reporting et du paramètre ini display_errors, 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 j'obtiens 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 vers le 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 AVKurov Jul 05 2017 at 16:04

Pour ceux qui utilisent nginx et ont un écran blanc même pour les fichiers avec <?php echo 123;. Dans mon cas, je n'avais pas cette option requise pour PHP dans le fichier de configuration nginx:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

Cette option n'était pas dans le fichier fastcgi_params, donc PHP ne fonctionnait pas et il n'y avait aucune erreur dans les journaux.