Comment afficher les erreurs PHP?

1732

J'ai vérifié mon fichier ini PHP ( php.ini) et display_errorsest défini, ainsi que le rapport d'erreurs E_ALL. J'ai redémarré mon serveur Web Apache.

J'ai même mis ces lignes en haut de mon script, et il ne détecte même pas de simples erreurs d'analyse. Par exemple, je déclare des variables avec un "$"et je ne ferme pas les instructions ";". Mais tous mes scripts affichent une page vierge sur ces erreurs, mais je veux réellement voir les erreurs dans la sortie de mon navigateur.

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

Que reste-t-il à faire?

Abdos
la source
8
Je n'ai pas encore expliqué pourquoi cela fonctionne parfois et pas d'autres, mais pour ceux qui souhaitent basculer rapidement les erreurs dans un script php (ou les activer via un $_REQUESTparamètre), ces deux lignes fonctionneront la plupart du temps.
brandonscript
vous pouvez bien voir les détails de l'erreur en activant xdebug à partir du fichier php ini.
jewelhuq
Voici un bref article qui couvre le sujet - blog.phplogger.com/2019/03/10/error-message-visibility-in-php
Bogdans

Réponses:

3200

Ça fonctionne toujours pour moi:

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

Cependant, cela ne fait pas que PHP affiche les erreurs d'analyse - la seule façon de montrer ces erreurs est de modifier votre php.ini avec cette ligne:

display_errors = on

(si vous n'y avez pas accès php.ini, mettre cette ligne .htaccesspeut également fonctionner):

php_flag display_errors 1
Fantaisie John
la source
9
Notez également que vous pouvez utiliser ces 3 lignes, puis inclure ('fileImWorkingOn.php') ;. Ensuite, vous pouvez également attraper les erreurs de syntaxe!
Snap
14
Bien que je ne sois pas SysOps, je pense que plus de gens ont un fichier .htaccess que php.ini, et ceux-ci viendraient tous les deux avant l'analyse, non? php_flag display_errors 1pour .htaccess
Ryan Taylor
1
Alors maintenant que les erreurs sont enregistrées, où vont-elles? Je suis allé dans / var / log / apache2 et il montre tous les journaux, mais il n'y a aucune information concernant le programme que j'ai récemment exécuté. Je ne reçois des informations sur le redémarrage du système qu'une fois par matin.
Michael
1
@Michael Les erreurs vont directement à l'écran ou à l'endroit où la sortie est redirigée
Fancy John
2
E_ALLn'est pas suffisant pour afficher toutes les erreurs en PHP 5.3. " E_STRICTfait partie de la version E_ALL5.4.0" - PHP Manual Vous avez besoin de E_ALL | E_STRICTou -1dans cette version.
Gerard Roche
155

Vous ne pouvez pas détecter les erreurs d'analyse lors de l'activation de la sortie d'erreur lors de l'exécution, car il analyse le fichier avant d'exécuter quoi que ce soit (et puisqu'il rencontre une erreur pendant cela, il n'exécutera rien). Vous devrez modifier la configuration réelle du serveur afin que display_errors soit activé et que le niveau approprié error_reporting soit utilisé. Si vous n'avez pas accès à php.ini, vous pourrez peut-être utiliser .htaccess ou similaire, selon le serveur.

Cette question peut fournir des informations supplémentaires.

Michael Madsen
la source
2
Ne savais pas ça. J'ai modifié le fichier php.ini manuellement et cela fonctionne maintenant. Merci!
Abs
143

Dans votre php.ini :

display_errors = on

Redémarrez ensuite votre serveur Web.

user1803477
la source
7
+ ①. Sur mon ubuntu /etc/php5/apache2/php.ini
m93a
5
pour redémarrer (Debian, Ubuntu, etc.)sudo service apache2 restart
Peter Krauss
4
Pour redémarrer sur OS X sudo apachectl -k restart.
Pea
3
fait amusant: vous pouvez localiser votre fichier php.ini chargé si vous mettez simplement phpinfo (); dans un fichier php vierge. c'est le 7e rang et appeléLoaded Configuration File
Frankenmint
Comment pouvons-nous faire si nous écrivons directement le code php sur le cPanel?
arqam
98

Pour afficher toutes les erreurs, vous devez:

1. Ayez ces lignes dans le script PHP que vous appelez à partir du navigateur (généralement index.php):

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

2. (a) Assurez-vous que ce script ne contient aucune erreur de syntaxe

-ou-

2. (b) Insérez display_errors = Onvotrephp.ini

Sinon, il ne peut même pas exécuter ces 2 lignes!

Vous pouvez vérifier les erreurs de syntaxe dans votre script en exécutant (sur la ligne de commande):

php -l index.php

Si vous incluez le script d'un autre script PHP alors il va afficher des erreurs de syntaxe dans le inclus script. Par exemple:

index.php

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

// Any syntax errors here will result in a blank screen in the browser

include 'my_script.php';

my_script.php

adjfkj // This syntax error will be displayed in the browser
andre
la source
51

Certains hébergeurs Web vous permettent de modifier les paramètres PHP dans le .htaccess fichier.

Vous pouvez ajouter la ligne suivante:

php_value display_errors 1

J'ai eu le même problème que le vôtre et cette solution l'a corrigé.

Kalhua
la source
Et si vous êtes dans un environnement nginx, ajoutez la valeur php à la configuration de votre site (sites disponibles) sous la directive location ~ \ .php. fastcgi_param PHP_VALUE "error_reporting = E_ALL; \ n display_errors = 1;";
Lazaros Kosmidis
40

Vous trouverez peut-être que tous les paramètres de "rapport d'erreurs" ou "d'erreurs d'affichage" ne semblent pas fonctionner dans PHP 7. En effet, la gestion des erreurs a changé. Essayez plutôt ceci:

try{
     // Your code
} 
catch(Error $e) {
    $trace = $e->getTrace();
    echo $e->getMessage().' in '.$e->getFile().' on line '.$e->getLine().' called from '.$trace[0]['file'].' on line '.$trace[0]['line'];
}

Ou, pour détecter les exceptions et les erreurs en une seule fois (ce n'est pas rétrocompatible avec PHP 5):

try{
     // Your code
} 
catch(Throwable $e) {
    $trace = $e->getTrace();
    echo $e->getMessage().' in '.$e->getFile().' on line '.$e->getLine().' called from '.$trace[0]['file'].' on line '.$trace[0]['line'];
}
Frank Forte
la source
1
Voulez-vous dire PHP7 ou PHP7.1? Je suis confus, j'ai essayé comme la réponse validée proposée et cela fonctionne, je pense que vous proposez quelque chose d'un peu différent à mon humble avis, en effet "pas de compatibilité descendante" et si vous devez modifier un code PHP complet <7 et devez ajouter du try{} catch() {}code partout dans votre code php déjà défini, je ne veux même pas penser au gâchis qui va être ..
vdegenne
@FancyJohn, cela pourrait aider: $bt = debug_backtrace(); print_r($bt);.
Frank Forte
@ballangddang, j'ai rencontré le problème avec PHP 7.0, où la seule façon dont je pouvais obtenir l'erreur à afficher était d'utiliser les blocs try / catch et spécifiquement la capture Error. Si vous réécrivez toutes les demandes (sauf peut-être JavaScript, CSS, Images, etc.) dans le fichier index.php, puis y avez le bloc try catch, cela facilite la tâche. Oui, tout système qui n'a pas de point d'entrée unique serait un casse-tête majeur à mettre à jour.
Frank Forte
PHP n'affiche-t-il pas d'exceptions non gérées? Vous en êtes sûr?
Martin Tournoij
Il doit afficher des exceptions non gérées. Si vous activez un tampon de sortie au début (afin que vous puissiez envoyer des en-têtes à tout moment avant de vider enfin le corps de la réponse), le message d'exception peut être perdu quelque part.
Frank Forte
33

Cela fonctionnera:

<?php
     error_reporting(E_ALL);
     ini_set('display_errors', 1);    
?>
Développeur principal
la source
33

Utilisation:

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

C'est la meilleure façon de l'écrire, mais une erreur de syntaxe donne une sortie vide, utilisez donc la console pour vérifier les erreurs de syntaxe. La meilleure façon de déboguer du code PHP est d'utiliser la console; exécutez ce qui suit:

php -l phpfilename.php
Abhijit Jagtap
la source
22

Réglez ceci dans votre fichier index.php :

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
Sumit Gupta
la source
20

Créez un fichier appelé php.ini dans le dossier où réside votre fichier PHP.

Dans php.ini, ajoutez le code suivant (je donne une simple erreur en affichant le code):

display_errors = on

display_startup_errors = on
NavyaKumar
la source
18

Voici un script PHP:

<?php
    ini_set("display_startup_errors", 1);
    ini_set("display_errors", 1);

    /* Reports for either E_ERROR | E_WARNING | E_NOTICE  | Any Error*/
    error_reporting(E_ALL);

    echo(abc); /* Notice: abc is an undefined constant */
?>

Pour une explication plus détaillée des erreurs PHP, visitez PHP Error - error_reporting () .

B.Balamanigandan
la source
2
En quoi est-ce différent de la réponse de Fancy John ?
Tous les travailleurs sont essentiels
@cpburnz - C'est une question simple, chacun ayant le même ensemble de codes dans leur saveur que la seule différence. J'ai donné un lien URL supplémentaire qui donnera plus d'informations sur l'erreur PHP.
B.Balamanigandan
15

Si, malgré le respect de toutes les réponses ci-dessus (ou si vous ne pouvez pas modifier votre fichier php.ini), vous ne pouvez toujours pas obtenir de message d'erreur, essayez de créer un nouveau fichier PHP qui permet de signaler les erreurs, puis incluez le fichier de problème. par exemple:

error_reporting(E_ALL);
ini_set('display_errors', 1);
require_once('problem_file.php');

Bien que tout soit correctement défini dans mon php.inifichier, c'était la seule façon de détecter une erreur d'espace de noms. Mon scénario exact était:

//file1.php
namespace a\b;
class x {
    ...
}

//file2.php
namespace c\d;
use c\d\x; //Dies because it's not sure which 'x' class to use
class x {
    ...
}
jxmallett
la source
1
Non, le rapport d'erreurs n'est pas un niveau de journal, c'est un champ de bits. Utiliser 999999 est une très mauvaise idée, utilisez une puissance de deux moins 1, par exemple 2047!
peterh
Vous avez absolument raison, @peterh! Je l'ai changé en E_ALL car cela permettra de signaler toutes les erreurs (sauf les erreurs strictes dans php 5.4 et ci-dessous).
jxmallett
15

J'allais généralement avec le code suivant dans mes projets PHP simples.

if(!defined('ENVIRONMENT')){
    define('ENVIRONMENT', 'DEVELOPMENT');
}

$base_url = null;

if (defined('ENVIRONMENT'))
{
    switch (ENVIRONMENT)
    {
        case 'DEVELOPMENT':
            $base_url = 'http://localhost/product/';
            ini_set('display_errors', 1);
            ini_set('display_startup_errors', 1);
            error_reporting(E_ALL|E_STRICT);
            break;

        case 'PRODUCTION':
            $base_url = 'Production URL'; /* https://google.com */
            error_reporting(0);
            /* Mechanism to log errors */
            break;

        default:
            exit('The application environment is not set correctly.');
    }
}
Channaveer Hakari
la source
15

Lorsque vous utilisez PHP comme module Apache, nous pouvons modifier les paramètres de configuration en utilisant les directives dans les fichiers de configuration Apache (par exemple httpd.conf) et les fichiers .htaccess. Pour ce faire, vous aurez besoin des privilèges «AllowOverride Options» ou «AllowOverride All».

Vérifiez ça

http://funbird.co.uk/blog/tech-articals/linux-tech-articals/enabling-error-display-php-via-htaccess

Mike
la source
Le lien est rompu (404).
Peter Mortensen
14

Si vous vous trouvez dans une situation où vous ne pouvez pas modifier le paramètre via php.iniou si .htaccessvous n'avez pas de chance d'afficher des erreurs lorsque vos scripts PHP contiennent des erreurs d'analyse. Vous devriez alors vous résoudre à peloter les fichiers sur la ligne de commande comme ceci:

find . -name '*.php' -type f -print0 | xargs -0 -n1 -P8 php -l | grep -v "No syntax errors"

Si votre hôte est tellement verrouillé qu'il ne permet pas de modifier la valeur via php.iniou .htaccess, il peut également interdire de modifier la valeur via ini_set. Vous pouvez le vérifier avec le script PHP suivant:

<?php
if( !ini_set( 'display_errors', 1 ) ) {
  echo "display_errors cannot be set.";
} else {
  echo "changing display_errors via script is possible.";
}
chiborg
la source
find . -name '*.php' -type f -exec php -l {} \; | grep -v 'No syntax errors detected'est plus simple
scones
14

Comme nous utilisons maintenant PHP 7, les réponses données ici ne sont plus correctes. Le seul qui soit encore correct est celui de Frank Forte , alors qu'il parle de PHP 7.

D'un autre côté, plutôt que d'essayer d'attraper des erreurs avec un try / catch, vous pouvez utiliser une astuce: utilisez include.

Voici trois morceaux de code:

Fichier: tst1.php

<?php
    error_reporting(E_ALL);
    ini_set('display_errors', 'On');
    // Missing " and ;
    echo "Testing
?>

L'exécuter en PHP 7 ne montrera rien.

Maintenant, essayez ceci:

Fichier: tst2.php

<?php
    error_reporting(E_ALL);
    ini_set('display_errors', 'On');
    include ("tst3.php");
?>

Fichier: tst3.php

<?php
    // Missing " and ;
    echo "Testing
?>

Exécutez maintenant tst2 qui définit le rapport d'erreur, puis incluez tst3. Tu verras:

Erreur d'analyse: erreur de syntaxe, fin de fichier inattendue, variable attendue (T_VARIABLE) ou $ {(T_DOLLAR_OPEN_CURLY_BRACES) ou {$ (T_CURLY_OPEN) dans tst3.php à la ligne 4

Peter
la source
13

Vous pouvez faire quelque chose comme ci-dessous:

Définissez les paramètres ci-dessous dans votre fichier d'index principal:

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

Ensuite, en fonction de vos besoins, vous pouvez choisir celui que vous souhaitez afficher:

Pour toutes les erreurs, avertissements et notifications:

    error_reporting(E_ALL); OR error_reporting(-1);

Pour toutes les erreurs:

    error_reporting(E_ERROR);

Pour tous les avertissements:

    error_reporting(E_WARNING);

Pour tous les avis:

    error_reporting(E_NOTICE);

Pour plus d'informations, cliquez ici .

Binit Ghetiya
la source
Qu'est-ce que le "fichier d'index principal" ? Fichier index.html?
Peter Mortensen
12

Vous pouvez ajouter votre propre gestionnaire d'erreurs personnalisé, qui peut fournir des informations de débogage supplémentaires. En outre, vous pouvez le configurer pour vous envoyer les informations par e-mail.

function ERR_HANDLER($errno, $errstr, $errfile, $errline){
    $msg = "<b>Something bad happened.</b> [$errno] $errstr <br><br>
    <b>File:</b> $errfile <br>
    <b>Line:</b> $errline <br>
    <pre>".json_encode(debug_backtrace(), JSON_PRETTY_PRINT)."</pre> <br>";

    echo $msg;

    return false;
}

function EXC_HANDLER($exception){
    ERR_HANDLER(0, $exception->getMessage(), $exception->getFile(), $exception->getLine());
}

function shutDownFunction() {
    $error = error_get_last();
    if ($error["type"] == 1) {
        ERR_HANDLER($error["type"], $error["message"], $error["file"], $error["line"]);
    }
}

set_error_handler ("ERR_HANDLER", E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED);
register_shutdown_function("shutdownFunction");
set_exception_handler("EXC_HANDLER");
lintabá
la source
7

Ce code en haut devrait fonctionner:

error_reporting(E_ALL);

Cependant, essayez de modifier le code sur le téléphone dans le fichier:

error_reporting =on
Wembo Mulumba
la source
6

La meilleure solution / facile / rapide que vous pouvez utiliser s'il s'agit d'un débogage rapide consiste à entourer votre code d'exceptions de capture. C'est ce que je fais quand je veux vérifier quelque chose de rapide en production.

try {
    // Page code
}
catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}
Xakiru
la source
Pour php7, catch (Throwable $e)c'est mieux ... Ou un autre bloc de capture en dessouscatch(Error $e)
Frank Forte
4

Ecrivez:

error_reporting(-1);
jewelhuq
la source
4

Voilà ce que j'ai appris. Dans le fichier PHP.INI,

error_reporting = E_ALL
display_errors = On
Salam
la source
2
Vous changez? Ajout à?
Peter Mortensen
atm votre réponse n'a aucun sens car son contexte manque; également stipulé par Peter Mortensen. Ne pas l'améliorer le prépare au "drapeau à supprimer" (par les bots). (De l'examen de faible qualité).
ZF007
4
    <?php
    // Turn off error reporting
    error_reporting(0);

    // Report runtime errors
    error_reporting(E_ERROR | E_WARNING | E_PARSE);

    // Report all errors
    error_reporting(E_ALL);

    // Same as error_reporting(E_ALL);
    ini_set("error_reporting", E_ALL);

    // Report all errors except E_NOTICE
    error_reporting(E_ALL & ~E_NOTICE);
    ?>

Pendant que votre site est en ligne, php.inidisplay_errors doit être désactivé pour des raisons de sécurité. Cependant, pour l'environnement de développement, les erreurs d'affichage peuvent être activées pour le dépannage.

pardeep
la source
4

Vous pouvez le faire en modifiant le fichier php.ini et en ajoutant ce qui suit

display_errors = on
display_startup_errors = on

OU vous pouvez également utiliser le code suivant car cela fonctionne toujours pour moi

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
Muhammad Adeel Malik
la source
3

Si vous avez installé Xdebug, vous pouvez remplacer chaque paramètre en définissant:

xdebug.force_display_errors = 1;
xdebug.force_error_reporting = -1;

force_display_errors

Type: int, Valeur par défaut: 0, Introduit dans Xdebug> = 2.3 Si ce paramètre est défini sur 1, les erreurs seront toujours affichées, quel que soit le paramètre de display_errors de PHP.

force_error_reporting

Type: int, valeur par défaut: 0, introduit dans Xdebug> = 2.3 Ce paramètre est un masque de bits, comme error_reporting. Ce masque binaire sera logiquement OU avec le masque binaire représenté par error_reporting pour dermine quelles erreurs doivent être affichées. Ce paramètre ne peut être effectué que dans php.ini et vous permet de forcer l'affichage de certaines erreurs, peu importe ce qu'une application fait avec ini_set ().

Peter Haberkorn
la source
3

Vous voudrez peut-être utiliser ce code:

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
baduker
la source
2

Signaler toutes les erreurs sauf E_NOTICE

error_reporting(E_ALL & ~E_NOTICE);

Afficher toutes les erreurs PHP

error_reporting(E_ALL);  or ini_set('error_reporting', E_ALL);

Désactiver tous les rapports d'erreur

error_reporting(0);
Shaikh Nadeem
la source
1

Dans Unix CLI , il est très pratique de rediriger uniquement les erreurs vers un fichier :

./script 2> errors.log

Puis à partir d'un autre shell, pour les changements en direct:

tail -f errors.log

ou simplement

watch cat errors.log
NVRM
la source
Comment cela répond-il à cette question sur PHP?
Peter Mortensen
./scriptest un script CLI php (hashbang #!/usr/bin/php). Vous pouvez rediriger les erreurs php dans un fichier de cette façon. Il s'agit de la tuyauterie Unix. Ce n'est pas php comme CGI.
NVRM
0

S'il se trouve sur la ligne de commande, vous pouvez exécuter phpavec -ddisplay_errors=1pour remplacer le paramètre dans php.ini:

php -ddisplay_errors=1 script.php
gvlasov
la source
-1

Outre les fonctions php.iniet ini_set()dans un script PHP, vous pouvez faire la même chose avec .htaccessethttpd.conf directives indiquées ci-dessous.

Certains hébergeurs permettent de définir les paramètres PHP via .htaccessethttpd.conf .

Masquer les erreurs PHP

php_flag display_startup_errors ON

php_flag display_errors ON

php_flag html_errors ON

php_flag log_errors on

php_flag ignore_repeated_errors off

php_flag ignore_repeated_source off

php_flag report_memleaks on

php_flag track_errors on

php_value docref_root 0

php_value docref_ext 0

php_value error_log /home/path/public_html/domain/PHP_errors.log

php_value error_reporting 999999999

php_value error_reporting -1

php_value log_errors_max_len 0

Order allow,deny

Deny from all

Satisfy All

trouvé cette réponse en recherchant un peu sur Google

mohitesachin217
la source