Wie werden PHP-Fehler angezeigt?

1731

Ich habe meine PHP-INI-Datei ( php.ini) überprüft und display_errorsist eingestellt und auch Fehlerberichterstattung ist E_ALL. Ich habe meinen Apache-Webserver neu gestartet.

Ich habe diese Zeilen sogar oben in mein Skript eingefügt, und es werden nicht einmal einfache Analysefehler abgefangen. Zum Beispiel deklariere ich Variablen mit a "$"und schließe keine Anweisungen ";". Alle meine Skripte zeigen eine leere Seite zu diesen Fehlern an, aber ich möchte die Fehler tatsächlich in meiner Browserausgabe sehen.

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

Was bleibt zu tun?

Abs
quelle
8
Ich habe noch nicht genau herausgefunden, warum dies manchmal funktioniert und nicht bei anderen, aber für alle, die Fehler in einem PHP-Skript schnell umschalten möchten (oder sie über einen $_REQUESTParameter aktivieren möchten ), funktionieren diese beiden Zeilen die meiste Zeit.
Brandonscript
Nun, Sie können Details des Fehlers sehen, indem Sie xdebug aus der PHP-INI-Datei aktivieren.
Jewelhuq
Hier ist ein kurzer Artikel, der das Thema behandelt - blog.phplogger.com/2019/03/10/error-message-visibility-in-php
Bogdans

Antworten:

3200

Das funktioniert bei mir immer:

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

Dies führt jedoch nicht dazu, dass PHP Analysefehler anzeigt. Die einzige Möglichkeit, diese Fehler anzuzeigen, besteht darin, Ihre php.ini mit der folgenden Zeile zu ändern:

display_errors = on

(Wenn Sie keinen Zugriff auf haben php.ini, .htaccessfunktioniert das Einfügen dieser Zeile möglicherweise auch):

php_flag display_errors 1
Lust auf John
quelle
9
Beachten Sie auch, dass Sie diese 3 Zeilen verwenden und dann ('fileImWorkingOn.php') einschließen können. Dann können Sie auch die Syntaxfehler abfangen!
Snap
14
Ich bin zwar kein SysOps, aber ich denke, mehr Leute haben eine .htaccess-Datei als php.ini, und diese würden beide vor dem Parsen kommen, oder? php_flag display_errors 1für .htaccess
Ryan Taylor
1
Wohin gehen die Fehler, nachdem sie protokolliert wurden? Ich bin zu / var / log / apache2 gegangen und es werden alle Protokolle angezeigt, aber es gibt keine Informationen zu dem Programm, das ich kürzlich ausgeführt habe. Ich erhalte nur einmal am Morgen Informationen über Systemneustarts.
Michael
1
@ Michael Die Fehler gehen direkt auf den Bildschirm oder dorthin, wo die Ausgabe umgeleitet wird
Fancy John
2
E_ALLreicht nicht aus, um alle Fehler in PHP 5.3 anzuzeigen . " E_STRICTwurde Teil von E_ALLin 5.4.0" - PHP-Handbuch Sie benötigen E_ALL | E_STRICToder -1in dieser Version.
Gerard Roche
155

Sie können keine Analysefehler abfangen, wenn Sie die Fehlerausgabe zur Laufzeit aktivieren, da die Datei analysiert wird, bevor tatsächlich etwas ausgeführt wird (und da dabei ein Fehler auftritt, wird nichts ausgeführt). Sie müssen die tatsächliche Serverkonfiguration so ändern, dass display_errors aktiviert ist und die entsprechende Fehlerberichterstattungsstufe verwendet wird. Wenn Sie keinen Zugriff auf php.ini haben, können Sie je nach Server möglicherweise .htaccess oder ähnliches verwenden.

Diese Frage kann zusätzliche Informationen liefern.

Michael Madsen
quelle
2
Wusste ich nicht. Ich habe die Datei php.ini manuell bearbeitet und sie funktioniert jetzt. Vielen Dank!
Abs
143

In Ihrer php.ini :

display_errors = on

Starten Sie dann Ihren Webserver neu.

user1803477
quelle
7
+ ①. Auf meinem Ubuntu /etc/php5/apache2/php.ini
m93a
5
zum Neustart (Debian, Ubuntu usw.)sudo service apache2 restart
Peter Krauss
4
Für Neustart auf OS X sudo apachectl -k restart.
Erbse
3
lustige Tatsache: Sie können Ihre geladene php.ini-Datei finden, wenn Sie einfach phpinfo () eingeben; in eine leere PHP-Datei. Es ist die 7. Reihe nach unten und heißtLoaded Configuration File
Frankenmint
Wie können wir vorgehen, wenn wir den PHP-Code direkt auf das cPanel schreiben?
Arqam
98

Um alle Fehler anzuzeigen, müssen Sie:

1. Haben Sie diese Zeilen in dem PHP-Skript, das Sie vom Browser aus aufrufen (normalerweise index.php):

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

2. (a) Stellen Sie sicher, dass dieses Skript keine Syntaxfehler enthält

-oder-

2. (b) Stellen Sie display_errors = OnIhre einphp.ini

Andernfalls können diese 2 Zeilen nicht einmal ausgeführt werden!

Sie können in Ihrem Skript nach Syntaxfehlern suchen, indem Sie Folgendes ausführen (in der Befehlszeile):

php -l index.php

Wenn Sie das Skript aus einem anderen PHP-Skript einschließen , werden Syntaxfehler im enthaltenen Skript angezeigt . Zum Beispiel:

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
quelle
51

Bei einigen Webhosting-Anbietern können Sie die PHP-Parameter in der .htaccessDatei ändern .

Sie können die folgende Zeile hinzufügen:

php_value display_errors 1

Ich hatte das gleiche Problem wie Sie und diese Lösung hat es behoben.

Kalhua
quelle
Wenn Sie sich in einer Nginx-Umgebung befinden, fügen Sie den PHP-Wert Ihrer Site-Konfiguration (Sites-Available) unter der Anweisung location ~ \ .php hinzu. fastcgi_param PHP_VALUE "error_reporting = E_ALL; \ n display_errors = 1;";
Lazaros Kosmidis
40

Möglicherweise funktionieren alle Einstellungen für "Fehlerberichterstattung" oder "Anzeigefehler" in PHP 7 nicht. Dies liegt daran, dass sich die Fehlerbehandlung geändert hat. Versuchen Sie stattdessen Folgendes:

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'];
}

Oder um Ausnahmen und Fehler auf einmal abzufangen (dies ist nicht abwärtskompatibel mit 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
quelle
1
Meinen Sie PHP7 oder PHP7.1? Ich bin verwirrt, ich habe versucht, die validierte Antwort vorzuschlagen, und es funktioniert. Ich denke, Sie schlagen meiner Meinung nach etwas anderes vor, in der Tat "keine Abwärtskompatibilität", und wenn Sie einen vollständigen PHP <7-Code ändern müssen und try{} catch() {}überall Code hinzufügen müssen In Ihrem bereits definierten PHP-Code möchte ich nicht einmal an das Chaos denken, das sein wird.
Vdegenne
@FancyJohn, das könnte helfen : $bt = debug_backtrace(); print_r($bt);.
Frank Forte
@ballangddang, ich bin auf das Problem mit PHP 7.0 gestoßen, bei dem der einzige Weg, den Fehler anzuzeigen, darin bestand, die try / catch-Blöcke zu verwenden und speziell zu fangen Error. Wenn Sie alle Anforderungen (außer möglicherweise JavaScript, CSS, Images usw.) in die Datei index.php umschreiben, können Sie den try catch-Block dort verwenden, um dies zu vereinfachen. Ja, jedes System, das keinen einzigen Einstiegspunkt hat, würde große Probleme beim Aktualisieren verursachen.
Frank Forte
Zeigt PHP keine unbehandelten Ausnahmen an? Ziemlich sicher?
Martin Tournoij
Es sollte unbehandelte Ausnahmen anzeigen. Wenn Sie zu Beginn einen Ausgabepuffer aktivieren (damit Sie jederzeit Header senden können, bevor Sie den Antworttext endgültig leeren), kann die Ausnahmemeldung möglicherweise irgendwo verloren gehen.
Frank Forte
33

Das wird funktionieren:

<?php
     error_reporting(E_ALL);
     ini_set('display_errors', 1);    
?>
Leitender Entwickler
quelle
33

Verwenden:

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

Dies ist der beste Weg, um es zu schreiben, aber ein Syntaxfehler führt zu einer leeren Ausgabe. Verwenden Sie daher die Konsole, um nach Syntaxfehlern zu suchen. Der beste Weg, um PHP-Code zu debuggen, ist die Verwendung der Konsole. Führen Sie Folgendes aus:

php -l phpfilename.php
Abhijit Jagtap
quelle
22

Stellen Sie dies in Ihrer index.php- Datei ein:

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

Erstellen Sie eine Datei mit dem Namen php.ini in dem Ordner, in dem sich Ihre PHP-Datei befindet.

Fügen Sie in der php.ini den folgenden Code hinzu (ich gebe einen einfachen Fehler beim Anzeigen des Codes):

display_errors = on

display_startup_errors = on
NavyaKumar
quelle
18

Hier ist ein PHP-Skript:

<?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 */
?>

Eine ausführlichere Erläuterung der PHP-Fehler finden Sie unter PHP Error - error_reporting () .

B. Balamanigandan
quelle
2
Wie unterscheidet sich das von Fancy Johns Antwort ?
Alle Arbeiter sind wesentlich
@cpburnz - Es ist eine einfache Frage, jeder hat die gleichen Codes in seinem Geschmack, die der einzige Unterschied ist. Ich habe zusätzlich einen URL-Link angegeben, der weitere Informationen zum PHP-Fehler enthält.
B. Balamanigandan
15

Wenn Sie trotz Befolgung aller oben genannten Antworten (oder wenn Sie Ihre php.ini-Datei nicht bearbeiten können) immer noch keine Fehlermeldung erhalten, erstellen Sie eine neue PHP-Datei, die die Fehlerberichterstattung ermöglicht, und fügen Sie dann die Problemdatei hinzu. z.B:

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

Obwohl in meiner php.iniDatei alles richtig eingestellt war , war dies die einzige Möglichkeit, einen Namespace-Fehler zu erkennen. Mein genaues Szenario war:

//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
quelle
1
Nein, die Fehlerberichterstattung ist keine Google-Ebene, sondern ein Bitfeld. Die Verwendung von 999999 ist eine sehr schlechte Idee. Verwenden Sie eine Zweierpotenz minus 1, zum Beispiel 2047!
Peter - Wiedereinsetzung Monica
Du hast absolut recht, @peterh! Ich habe es in E_ALL geändert, da dies die Meldung aller Fehler ermöglicht (mit Ausnahme strenger Fehler in PHP 5.4 und darunter).
jxmallett
15

Normalerweise würde ich in meinen einfachen PHP-Projekten den folgenden Code verwenden.

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
quelle
15

Wenn Sie PHP als Apache-Modul verwenden, können Sie die Konfigurationseinstellungen mithilfe von Anweisungen in Apache-Konfigurationsdateien (z. B. httpd.conf) und .htaccess-Dateien ändern. Dazu benötigen Sie die Berechtigungen "AllowOverride Options" oder "AllowOverride All".

Überprüfen Sie dies

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

Mike
quelle
Die Verbindung ist unterbrochen (404).
Peter Mortensen
14

Wenn Sie sich irgendwie in einer Situation befinden, in der Sie die Einstellung nicht über ändern können, php.inioder wenn Sie kein .htaccessGlück haben, Fehler anzuzeigen, wenn Ihre PHP-Skripte Analysefehler enthalten. Sie müssten dann beschließen, die Dateien in der Befehlszeile wie folgt zu fusseln :

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

Wenn Ihr Host so gesperrt ist, dass er das Ändern des Werts über php.inioder nicht zulässt .htaccess, kann er auch das Ändern des Werts über nicht zulassen ini_set. Sie können dies mit dem folgenden PHP-Skript überprüfen:

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

Da wir jetzt PHP 7 ausführen, sind die hier gegebenen Antworten nicht mehr korrekt. Der einzige, der noch in Ordnung ist, ist der von Frank Forte , der über PHP 7 spricht.

Auf der anderen Seite können Sie einen Trick verwenden, anstatt Fehler mit einem Versuch / Fang abzufangen: Verwenden Sie include.

Hier drei Codeteile:

Datei: tst1.php

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

Wenn Sie dies in PHP 7 ausführen, wird nichts angezeigt.

Versuchen Sie Folgendes:

Datei: tst2.php

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

Datei: tst3.php

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

Führen Sie nun tst2 aus, wodurch die Fehlerberichterstattung festgelegt wird, und schließen Sie dann tst3 ein. Du wirst sehen:

Analysefehler: Syntaxfehler, unerwartetes Dateiende, erwartete Variable (T_VARIABLE) oder $ {(T_DOLLAR_OPEN_CURLY_BRACES) oder {$ (T_CURLY_OPEN) in tst3.php in Zeile 4

Peter
quelle
13

Sie können Folgendes tun:

Stellen Sie die folgenden Parameter in Ihrer Hauptindexdatei ein:

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

Dann können Sie basierend auf Ihren Anforderungen auswählen, welche Sie anzeigen möchten:

Für alle Fehler, Warnungen und Hinweise:

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

Für alle Fehler:

    error_reporting(E_ERROR);

Für alle Warnungen:

    error_reporting(E_WARNING);

Für alle Hinweise:

    error_reporting(E_NOTICE);

Weitere Informationen finden Sie hier .

Binit Ghetiya
quelle
Was ist die "Hauptindexdatei" ? Datei index.html?
Peter Mortensen
12

Sie können Ihren eigenen benutzerdefinierten Fehlerbehandler hinzufügen, der zusätzliche Debuginformationen bereitstellt. Darüber hinaus können Sie es so einrichten, dass Sie die Informationen per E-Mail erhalten.

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á
quelle
7

Dieser Code sollte funktionieren:

error_reporting(E_ALL);

Versuchen Sie jedoch, den Code auf dem Telefon in der Datei zu bearbeiten:

error_reporting =on
Wembo Mulumba
quelle
6

Die beste / einfachste / schnellste Lösung, die Sie verwenden können, wenn es sich um ein schnelles Debugging handelt, besteht darin, Ihren Code mit abfangenden Ausnahmen zu umgeben. Das ist es, was ich mache, wenn ich etwas schnell in der Produktion überprüfen möchte.

try {
    // Page code
}
catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}
Xakiru
quelle
Für PHP7 catch (Throwable $e)ist besser ... oder ein anderer Fangblock daruntercatch(Error $e)
Frank Forte
4

Einfach schreiben:

error_reporting(-1);
Jewelhuq
quelle
4

Das habe ich gelernt. In der PHP.INI-Datei

error_reporting = E_ALL
display_errors = On
Salam
quelle
2
Wechseln? Hinzufügen zu?
Peter Mortensen
atm deine Antwort macht keinen Sinn, weil es keinen Kontext gibt; auch von Peter Mortensen festgelegt. Wenn es nicht verbessert wird, wird es für "Flag zum Entfernen" (von Bots) vorbereitet. (Aus Low-Quality Review).
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);
    ?>

Während Ihre Site aktiv ist, sollte in der php.iniDatei aus Sicherheitsgründen display_errors deaktiviert sein. Für die Entwicklungsumgebung können display_errors jedoch zur Fehlerbehebung aktiviert werden.

pardeep
quelle
4

Sie können dies tun, indem Sie die Datei php.ini ändern und Folgendes hinzufügen

display_errors = on
display_startup_errors = on

ODER Sie können auch den folgenden Code verwenden, da dies bei mir immer funktioniert

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

Wenn Sie Xdebug installiert haben, können Sie jede Einstellung überschreiben, indem Sie Folgendes festlegen :

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

force_display_errors

Typ: int, Standardwert: 0, Eingeführt in Xdebug> = 2.3 Wenn diese Einstellung auf 1 gesetzt ist, werden immer Fehler angezeigt, unabhängig von der Einstellung der display_errors von PHP.

force_error_reporting

Typ: int, Standardwert: 0, Eingeführt in Xdebug> = 2.3 Diese Einstellung ist eine Bitmaske wie error_reporting. Diese Bitmaske wird logisch mit der durch error_reporting dargestellten Bitmaske ODER-verknüpft, um zu ermitteln, welche Fehler angezeigt werden sollen. Diese Einstellung kann nur in der php.ini vorgenommen werden und ermöglicht es Ihnen, die Anzeige bestimmter Fehler zu erzwingen, unabhängig davon, was eine Anwendung mit ini_set () macht.

Peter Haberkorn
quelle
3

Möglicherweise möchten Sie diesen Code verwenden:

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
Baduker
quelle
2

Alle Fehler außer E_NOTICE melden

error_reporting(E_ALL & ~E_NOTICE);

Alle PHP-Fehler anzeigen

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

Deaktivieren Sie alle Fehlerberichte

error_reporting(0);
Shaikh Nadeem
quelle
1

In Unix CLI ist es sehr praktisch, nur Fehler in eine Datei umzuleiten :

./script 2> errors.log

Dann aus einer anderen Shell für Live-Änderungen:

tail -f errors.log

oder einfach

watch cat errors.log
NVRM
quelle
Wie beantwortet das diese Frage zu PHP?
Peter Mortensen
./scriptist ein PHP-CLI-Skript (Hashbang #!/usr/bin/php). Sie können die PHP-Fehler in einer Datei auf diese Weise umleiten. Dies ist eine Unix-Rohrleitung. Dies ist nicht PHP als CGI.
NVRM
0

Wenn es auf der Kommandozeile ist, können Sie laufen phpmit -ddisplay_errors=1zu überschreiben die Einstellung in php.ini:

php -ddisplay_errors=1 script.php
gvlasov
quelle
-1

Anders als die php.iniund ini_set()Funktionen in einem PHP - Skript, können Sie dieses gleiche tun mit .htaccessund httpd.confRichtlinien unten.

Einige Hosting-Anbieter erlauben das Festlegen von PHP-Einstellungen über .htaccessund httpd.conf.

PHP-Fehler ausblenden

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

fand diese Antwort durch ein wenig googeln

Mohitesachin217
quelle