Wie kann ich nützliche Fehlermeldungen in PHP erhalten?


583

Sehr oft werde ich versuchen, ein PHP-Skript auszuführen und nur einen leeren Bildschirm zurück zu bekommen. Keine Fehlermeldung; nur ein leerer Bildschirm. Die Ursache könnte ein einfacher Syntaxfehler (falsche Klammer, fehlendes Semikolon) oder ein fehlgeschlagener Funktionsaufruf oder etwas ganz anderes gewesen sein.

Es ist sehr schwierig herauszufinden, was schief gelaufen ist. Am Ende kommentiere ich Code aus, gebe überall "Echo" -Anweisungen ein usw., um das Problem einzugrenzen. Aber es muss doch einen besseren Weg geben, oder?

Gibt es eine Möglichkeit, PHP dazu zu bringen, eine nützliche Fehlermeldung zu erzeugen, wie es Java tut?




4
@ JuannStrauss, das ist es zu unterschätzen. Und wenn Sie endlich die Fehler sehen, heißt es T_PAAMAYIM_NEKUDOTAYIM. Oder vielleicht "muss eine Instanz von Integer sein, Integer gegeben" .
Pacerier

Antworten:


498

Bei Syntaxfehlern müssen Sie die Fehleranzeige in der php.ini aktivieren. Standardmäßig sind diese deaktiviert, da ein "Kunde" die Fehlermeldungen nicht sehen soll. Auf dieser Seite in der PHP-Dokumentation finden Sie Informationen zu den beiden Anweisungen: error_reportingund display_errors. display_errorsist wahrscheinlich derjenige, den Sie ändern möchten. Wenn Sie die php.ini nicht ändern können, können Sie einer .htaccess-Datei auch die folgenden Zeilen hinzufügen:

php_flag  display_errors        on
php_value error_reporting       2039

Möglicherweise möchten Sie den Wert von E_ALL (wie von Gumbo erwähnt) für Ihre PHP-Version verwenden error_reporting, um alle Fehler zu erhalten. Mehr Info

3 weitere Elemente: (1) Sie können die Fehlerprotokolldatei überprüfen, da sie alle Fehler enthält (es sei denn, die Protokollierung wurde deaktiviert). (2) Das Hinzufügen der folgenden 2 Zeilen hilft Ihnen beim Debuggen von Fehlern, die keine Syntaxfehler sind:

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

(3) Eine andere Option ist die Verwendung eines Editors, der bei der Eingabe nach Fehlern sucht , z. B. PhpEd . PhpEd wird außerdem mit einem Debugger geliefert, der detailliertere Informationen liefern kann. (Der PhpEd-Debugger ist xdebug sehr ähnlich und wird direkt in den Editor integriert, sodass Sie 1 Programm verwenden, um alles zu erledigen.)

Cartmans Link ist auch sehr gut: http://www.ibm.com/developerworks/library/os-debug/


25
2039 ist der Wert von E_ERROR | E_WARNING | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING | E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE. Siehe docs.php.net/manual/en/errorfunc.constants.php
Gumbo

Ich mag die Option der .htaccess-Datei. Es hilft mir beim Debuggen in einem Bereich, der nicht Teil der öffentlichen Website ist. Vielen Dank für diesen Tipp!
Jacekn

1
Ich würde hinzufügen, dass Protokollierungsfehler in der Datei (und sie dort nachschlagen) die beste Lösung sind. Verlassen Sie sich nicht darauf, Fehler auf der Seite anzuzeigen - sie können sie ruinieren, Sie können vergessen, die Fehlerberichterstattung für die Produktionsstätte
einzuschalten,

455

Folgendes aktiviert alle Fehler:

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

Siehe auch die folgenden Links


28
Nehmen Sie diese Änderungen am besten auf der Ebene der INI-Datei vor. Das Aktivieren der Fehlerberichterstattung innerhalb eines Skripts ist nutzlos, da es bei Syntaxfehlern oder anderen schwerwiegenden Fehlern, die die Kompilierungsphase beenden, nicht hilft. Das Skript wird lange vor Beginn der Ausführung beendet und erreicht die Berichtsüberschreibungen.
Marc B

Sie sind in der Tat richtig. Ich habe nicht bemerkt, dass der Umzug auf Ihren eigenen Server erfolgt.
Eljakim

6
Führen Sie phpinfo () aus, um die richtige Datei php.ini zu finden. Suchen Sie nach der Zeile Loaded Configuration File .
Borrible

1
Wenn Sie nach Fehlern suchen, die während der Kompilierungsphase auftreten, überprüfen Sie Ihre Apache-Protokolle häufig unter /var/log/apache2/error.log
csi

1
Diese Antwort schlägt auf PHP7 fehl, wenn die strikte Eingabe aktiviert ist, da der zweite Parameter von ini_seteine Zeichenfolge ist.
PeeHaa

175

Der folgende Code sollte alle Fehler anzeigen:

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

?>

Die einzige Möglichkeit, eine leere Seite mit diesem Code zu generieren, besteht darin, dass im Shutdown-Handler ein Fehler auftritt. Ich habe dies von meinem eigenen CMS kopiert und eingefügt, ohne es zu testen, aber ich bin sicher, dass es funktioniert.


4
Ich bekomme eine leere Seite von diesem Code. Was meinen Sie mit "Sie haben einen Fehler im Shutdown-Handler" und was soll ich tun, um das Problem zu lösen?
Paolo M

@PaoloM, er sagt einen Fehler in der ShutdownHandlerobigen Funktion . Grundsätzlich ist dies ein Not-Aus-Hack anstelle einer ordnungsgemäßen Fehlerbehandlung.
Pacerier

Danke, war nützlich, aber wie kann ich E_NOTICEFehler in dieser Funktion deaktivieren ?
MajAfy

Dies ist die richtige Lösung, aber seien Sie vorsichtig mit der Offenlegung von Informationen, wenn ein Fehler auftritt ... (lieber Protokollierung als Echo an Benutzer)
Sam Jason Braddock

1
Ich verwende dies, wenn Symfony schwerwiegende Fehler nicht richtig abfangen kann.
COil

61

Fehler und Warnungen werden normalerweise in ....\logs\php_error.logoder ....\logs\apache_error.logabhängig von Ihren php.ini-Einstellungen angezeigt.

Auch nützliche Fehler werden häufig an den Browser weitergeleitet, aber da sie kein gültiges HTML sind, werden sie nicht angezeigt.

So "tail -f"Ihre Log - Dateien und wenn Sie ein leerer Bildschirm Verwendung IEs bekommen‚Ansicht‘->‚Quelle‘Menüoptionen die rohe Ausgabe anzuzeigen.


13
Leider zeigt die Ansichtsquellenquelle auch nichts an.
Matthew Scharley

2
Analysefehler sollten im Fehlerprotokoll des Apache sichtbar sein, unabhängig davon, welche Einstellung Sie irgendwo anders haben. Wenn Sie keine Kontrolle über den Server haben, ist es möglicherweise schwierig, das Apache-Fehlerprotokoll abzurufen. Ich empfehle jedoch, dass Sie mit Ihrem Anbieter sprechen und das Fehlerprotokoll für Sie verfügbar macht. Abgesehen davon kann ich nur vorschlagen, welche anderen Benutzer Ihren Code auf Analysefehler auf Ihrem lokalen Entwicklungsserver überprüfen, bevor Sie ihn für die Produktion bereitstellen. Auch eine validierende IDE wie die PDT von Eclipse kann eine große Hilfe sein.
Guss

5
Als ich darauf zurückkam, hatte ich kürzlich ein Stapelüberlaufproblem, das selbst in den Protokollen keine Fehler erzeugte und sich erst als solches manifestierte, als ich xdebug auf dem Server installierte. Gah.
Matthew Scharley

Wenn Sie die php.ini nicht ändern können, erstellen Sie eine .htaccess-Datei mit php_flag display_errors 1.
Tom

59

Sie können die folgenden Zeilen in die Datei aufnehmen, die Sie debuggen möchten:

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

Dies überschreibt die Standardeinstellungen in php.ini, wodurch PHP die Fehler nur an das Protokoll meldet.


2
Das stimmt. In diesem Fall müssen die Werte direkt im INI eingestellt werden - für eine reine Entwicklungsumgebung kann dies ohnehin vorzuziehen sein.
Tomalak

53

PHP-Konfiguration

2 Einträge in der php.ini bestimmen die Ausgabe von Fehlern:

  1. display_errors
  2. error_reporting

In der Produktion , display_errorswird in der Regel auf Off(was eine gute Sache ist, weil Fehleranzeige in Produktionsstätten im Allgemeinen nicht erwünscht ist!).

In der Entwicklung sollte es jedoch auf gesetzt sein On, damit Fehler angezeigt werden. Überprüfen Sie !

error_reporting(ab PHP 5.3) ist standardmäßig auf eingestellt E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED(dh alles wird angezeigt, mit Ausnahme von Hinweisen, strengen Standards und Verfallshinweisen). Stellen Sie im Zweifelsfall so ein, E_ALLdass alle Fehler angezeigt werden. Überprüfen Sie !

Wow wow! Kein Scheck! Ich kann meine php.ini nicht ändern!

Das ist eine Schande. Normalerweise erlauben gemeinsam genutzte Hosts die Änderung ihrer php.ini-Datei nicht. Daher ist diese Option leider nicht verfügbar. Aber keine Angst! Wir haben andere Möglichkeiten !

Laufzeitkonfiguration

Im gewünschten Skript können wir die php.ini-Einträge zur Laufzeit ändern! Das heißt, es wird ausgeführt, wenn das Skript ausgeführt wird! Süss!

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

Diese beiden Zeilen haben den gleichen Effekt wie das Ändern der php.ini-Einträge wie oben! Genial!

Ich bekomme immer noch eine leere Seite / 500 Fehler!

Das bedeutet, dass das Skript noch nicht einmal ausgeführt wurde! Das passiert normalerweise, wenn Sie einen Syntaxfehler haben!

Bei Syntaxfehlern gelangt das Skript nicht einmal zur Laufzeit. Es schlägt beim Kompilieren fehl , was bedeutet, dass die Werte in der php.ini verwendet werden. Wenn Sie diese nicht geändert haben, können Fehler möglicherweise nicht angezeigt werden.

Fehlerprotokolle

Darüber hinaus protokolliert PHP standardmäßig Fehler. Beim Shared Hosting befindet es sich möglicherweise in einem dedizierten Ordner oder im selben Ordner wie das fehlerhafte Skript.

Wenn Sie Zugriff auf php.ini haben, finden Sie es unter dem error_logEintrag.


30

Es gibt eine wirklich nützliche Erweiterung namens " xdebug ", die Ihre Berichte auch viel schöner macht.


2
In der Tat ist dies ein sehr nützliches Debugging-Tool, das Fehlermeldungen viel ausführlicher macht, mit vollständigen Stack-Traces und variablen Dumps und allem.
Hbw

2
Ja. Und dann verwenden Sie so etwas wie das VimDebugger-Plugin, um Ihren Code zu durchlaufen und herauszufinden, wo er schief geht.
Sander Marechal

1
NetBeans mit xdebug hier. Es ist so genial. Ich bin neu in PHP (normalerweise ASP.NET) und habe zuvor Echo-Anweisungen ausgegeben.
Einige Canuck

30

Ich verwende diese Syntax immer ganz oben im PHP-Skript.

ini_set('error_reporting', E_ALL);
ini_set('display_errors', 'On');  //On or Off

3
Es tut mir leid, aber -1, weil ich die anderen bereits veröffentlichten Antworten nicht gelesen habe. Dies wird im .htaccess wie bereits mehrfach erwähnt erledigt.
Matthew Scharley

12
übliches "kostenloses Hosting" ignoriert den .htaccess
FDisk

27

Für eine schnelle, praktische Fehlerbehebung empfehle ich normalerweise hier auf SO:

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

am Anfang des Skripts stehen, das unter Fehlerbehebung steht. Dies ist nicht perfekt, die perfekte Variante ist, dass Sie dies auch in aktivieren php.iniund die Fehler in PHP protokollieren, um Syntax- und Startfehler abzufangen.

Die hier beschriebenen Einstellungen zeigen alle Fehler, Hinweise und Warnungen an, einschließlich strenger, unabhängig von der PHP-Version.

Nächste Dinge zu beachten:

  • Installieren Sie Xdebug und aktivieren Sie das Remote-Debugging mit Ihrer IDE.

Siehe auch:


27

Es ist möglich, einen Hook zu registrieren, um den letzten Fehler oder die letzte Warnung sichtbar zu machen.

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

register_shutdown_function('shutdown');

Wenn Sie diesen Code am Anfang Ihrer index.php hinzufügen, können Sie die Probleme beheben.


1
Dies ist reines Gold für Leute, die in Webhosts stecken geblieben sind, die keinen Fehler anzeigen, aber keinen Protokollzugriff erlauben
Rafael Mena Barreto

18

Dies ist ein Problem der Konfiguration im Vergleich zur Laufzeit

Es ist wichtig zu erkennen, dass während des Kompilierungs- oder Parsing- Schritts ein Syntax- oder Analysefehler auftritt. Dies bedeutet, dass PHP abgebrochen wird, bevor es überhaupt die Möglichkeit hat, Ihren Code auszuführen. Wenn Sie also die PHP- display_errorsKonfiguration zur Laufzeit ändern (dies umfasst alles von der Verwendung ini_setin Ihrem Code bis zur Verwendung von .htaccess, einer Laufzeitkonfigurationsdatei), werden nur die standardmäßig geladenen Konfigurationseinstellungen verwendet .

So vermeiden Sie WSOD in der Entwicklung immer

Um zu vermeiden , eine WSOD Sie sicherstellen möchten , dass Ihre geladene Konfigurationsdatei hat display_errorsauf und error_reportingSatz -1( dies entspricht E_ALL , weil es alle Bits gewährleistet , eingeschaltet sind , unabhängig davon , welche Version von PHP Sie laufen ). Codieren Sie den konstanten Wert von E_ALL nicht fest, da sich dieser Wert zwischen verschiedenen PHP-Versionen ändern kann.

Die geladene Konfiguration ist entweder Ihre geladene php.iniDatei oder Ihre apache.confoder httpd.confoder die virtuelle Hostdatei. Diese Dateien werden während der Startphase nur einmal gelesen (wenn Sie beispielsweise Apache httpd oder php-fpm zum ersten Mal starten) und nur durch Änderungen der Laufzeitkonfiguration überschrieben. Wenn Sie sicherstellen, dass display_errors = 1und error_reporting = -1in Ihrer geladenen Konfigurationsdatei sichergestellt ist, dass Sie niemals ein WSOD sehen, unabhängig von der Syntax oder dem Analysefehler , die auftreten, bevor eine Laufzeitänderung wie ini_set('display_errors', 1);oder stattfinden error_reporting(E_ALL);kann.

So finden Sie Ihre (php.ini) geladenen Konfigurationsdateien

Um Ihre geladenen Konfigurationsdateien zu finden, erstellen Sie einfach eine neue PHP-Datei mit nur dem folgenden Code ...

<?php
phpinfo();

Zeigen Sie dann mit Ihrem Browser dorthin und sehen Sie sich die analysierten geladenen Konfigurationsdateien und zusätzlichen INI-Dateien an , die sich normalerweise oben in Ihrem befinden phpinfo()und den absoluten Pfad zu allen geladenen Konfigurationsdateien enthalten.

Wenn Sie (none)anstelle der Datei sehen, bedeutet dies, dass Sie keine php.ini im Pfad der Konfigurationsdatei (php.ini) haben . Sie können also die mit PHP gelieferte stock php.ini von hier herunterladen und als php.ini in Ihren Konfigurationsdateipfad kopieren. Stellen Sie dann sicher, dass Ihr PHP-Benutzer über ausreichende Berechtigungen zum Lesen aus dieser Datei verfügt. Sie müssen httpd oder php-fpm neu starten, um es zu laden. Denken Sie daran, dass dies die Entwicklungsdatei php.ini ist, die mit der PHP-Quelle geliefert wird. Also bitte nicht in der Produktion verwenden!


Mach das einfach nicht in der Produktion

Dies ist wirklich der beste Weg, um ein WSOD in der Entwicklung zu vermeiden. Jeder, der vorschlägt, dass Sie Ihr PHP-Skript an die Spitze ini_set('display_errors', 1);oder error_reporting(E_ALL);in Ihr PHP-Skript setzen oder .htaccess wie hier verwenden, hilft Ihnen nicht dabei, ein WSOD zu vermeiden, wenn ein Syntax- oder Analysefehler auftritt (wie in Ihrem Fall hier), wenn Ihre Konfigurationsdatei geladen ist hat display_errorsausgeschaltet.

Viele Leute (und display_errorsStandardinstallationen von PHP) verwenden eine Production-INI-Datei, die standardmäßig deaktiviert ist, was normalerweise zu derselben Frustration führt, die Sie hier erlebt haben. Da PHP es beim Start bereits deaktiviert hat, tritt ein Syntax- oder Analysefehler auf und es wird nichts ausgegeben. Sie erwarten, dass Sie ini_set('display_errors',1);oben in Ihrem PHP-Skript dies hätten vermeiden sollen, aber es spielt keine Rolle, ob PHP Ihren Code nicht analysieren kann, da er niemals die Laufzeit erreicht hat.


17

Wenn Sie super cool sind, könnten Sie versuchen:

$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);

Dies zeigt nur Fehler an, wenn Sie lokal ausgeführt werden. Außerdem erhalten Sie die Variable test_server, die Sie gegebenenfalls an anderen Stellen verwenden können.

Alle Fehler, die auftreten, bevor das Skript ausgeführt wird, werden nicht abgefangen, aber für 99% der Fehler, die ich mache, ist dies kein Problem.


2
Wenn Sie zwischen lokalen und Produktionsumgebungen unterscheiden, sollten Sie Fehler einfach global aktivieren oder deaktivieren (in Ihrer php.ini) und nicht in Code, der auch Produktionscode sein kann. Wenn Sie eine Produktionswebsite in ihrer Produktionsumgebung debuggen müssen und nur die Fehler anzeigen möchten $_SERVER['REMOTE_HOST'], überprüfen Sie mit, ob der Client Sie sind.
Jaap Haagmans

17

Wählen Sie oben auf der Seite einen Parameter aus

error_reporting(E_ERROR | E_WARNING | E_PARSE);

16

Um dies beizubehalten und zu vereinfachen, können Sie Ihre Datei php.ini bearbeiten. Es wird normalerweise in /etc/php.inioder gespeichert /etc/php/php.ini, aber php.inije nach den Einrichtungsrichtlinien Ihres Hosting-Anbieters können mehr lokale Benutzer es überschreiben. Überprüfen Sie eine phpinfo()Datei Loaded Configuration Fileoben, um sicherzustellen, welche zuletzt geladen wird.

Suchen Sie in dieser Datei nach display_errors. Es sollten nur 3 Instanzen vorhanden sein, von denen 2 kommentiert sind.

Ändern Sie die unkommentierte Zeile in:

display_errors = stdout

16

Keine Ahnung, ob es helfen wird, aber hier ist ein Teil meiner Standard-Konfigurationsdatei für PHP-Projekte. Ich neige dazu, nicht zu sehr von den Apache-Konfigurationen abhängig zu sein, selbst von meinem eigenen Server.

Ich habe nie das Problem des verschwindenden Fehlers. Vielleicht gibt Ihnen hier etwas eine Idee.

Bearbeitet, um APPLICATON_LIVE anzuzeigen

/*
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>");
}

@Eli, Dies hat jedoch einen Laufzeit-Overhead pro Seitenanforderung .
Pacerier

bis 1 für das Konzept, dass Debug-Einstellungen übersehen werden, jedoch der Server konfiguriert ist, gut, während Sie
bereitstellen

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

Darüber hinaus können Sie mit xdebug detailliertere Informationen erhalten .


Xdebug kann von php.ini
Jewelhuq

15

Ich empfehle Nette Tracy zur besseren Visualisierung von Fehlern und Ausnahmen in PHP:

Nette Tracy Screenshot


3
Tracy achtet auf die richtige Einstellung aller Anzeigefehler und Fehlerberichterstattungsoptionen, um in solchen Situationen, wie im ursprünglichen Beitrag beschrieben, eine Ausgabe bereitzustellen. Daher ist dieses Tool besonders hilfreich, um den Fragesteller anzusprechen. "Kann jemand gute Tipps, Tools und Techniken zum PHP-Debuggen empfehlen? ".
Jan Drábek

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

10
error_reporting(E_ALL | E_STRICT);

Und aktivieren Sie Anzeigefehler in der php.ini


9

Sie können Ihren eigenen Fehlerbehandler in PHP registrieren . Das Speichern aller Fehler in einer Datei kann Ihnen beispielsweise in diesen dunklen Fällen helfen. Beachten Sie, dass Ihre Funktion aufgerufen wird, unabhängig davon, auf was Ihre aktuelle Fehlerberichterstattung eingestellt ist. Sehr einfaches Beispiel:

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

Die zwei wichtigsten Zeilen, die Sie benötigen, um nützliche Fehler aus PHP herauszuholen, sind:

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

Wie von anderen Mitwirkenden hervorgehoben, sind diese aus Sicherheitsgründen standardmäßig deaktiviert. Als nützlicher Tipp: Wenn Sie Ihre Site einrichten, ist es praktisch, einen Wechsel für Ihre verschiedenen Umgebungen vorzunehmen, damit diese Fehler in Ihren lokalen und Entwicklungsumgebungen standardmäßig aktiviert sind. Dies kann mit dem folgenden Code erreicht werden (idealerweise in Ihrer index.php- oder Konfigurationsdatei, damit diese von Anfang an aktiv ist):

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

öffne deine php.ini und stelle sicher, dass sie eingestellt ist auf:

display_errors = On

Starten Sie Ihren Server neu.


6

Vielleicht möchten Sie auch PHPStorm als Code-Editor ausprobieren. Während der Eingabe im Editor werden viele PHP- und andere Syntaxfehler angezeigt.


6

Wenn Sie ein Ubuntu-Benutzer sind, gehen Sie zu Ihrem Terminal und führen Sie diesen Befehl aus

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

Hier werden die letzten 50 Fehler angezeigt. Es gibt eine error.logFehlerdatei für apache2, die alle Fehler protokolliert.


5

Fügen Sie Ihrem Skript Folgendes hinzu, um die vollständige Fehlerberichterstattung zu aktivieren:

error_reporting(E_ALL);

Dadurch werden auch nur minimale Warnungen angezeigt. Und für alle Fälle:

ini_set('display_errors', '1');

Erzwingt die Anzeige von Fehlern. Dies sollte auf Produktionsservern deaktiviert sein, jedoch nicht während der Entwicklung.


Wie bei Tomalaks Antwort funktioniert dies bei Syntaxfehlern nicht.
Darryl Hein

5

Die „FEHLER“ sind die nützlichsten Dinge für die Entwickler, um ihre Fehler zu kennen und sie zu beheben, damit das System perfekt funktioniert.

PHP bietet einige bessere Möglichkeiten, um die Entwickler zu kennen, warum und wo ihr Code die Fehler enthält. Wenn Entwickler diese Fehler kennen, können sie ihren Code auf viele Arten verbessern.

Beste Möglichkeiten, um die folgenden zwei Zeilen oben im Skript zu schreiben, um alle Fehlermeldungen zu erhalten:

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

Eine andere Möglichkeit, Debugger-Tools wie xdebug in Ihrer IDE zu verwenden.


4

Sie können die vollständige Fehlerberichterstattung aktivieren (einschließlich Hinweisen und strengen Meldungen). Einige Leute finden das zu ausführlich, aber es ist einen Versuch wert. Setzen Sie error_reportingauf E_ALL | E_STRICTin der php.ini.

error_reporting = E_ALL | E_STRICT

E_STRICT benachrichtigt Sie über veraltete Funktionen und gibt Ihnen Empfehlungen zu den besten Methoden für bestimmte Aufgaben.

Wenn Sie keine Benachrichtigungen wünschen, andere Nachrichtentypen jedoch hilfreich finden, schließen Sie Benachrichtigungen aus:

error_reporting = (E_ALL | E_STRICT) & ~E_NOTICE

display_errorsStellen Sie außerdem sicher, dass dies in der php.ini aktiviert ist. Wenn Ihre PHP-Version älter als 5.2.4 ist, stellen Sie Folgendes ein On:

display_errors = "On"

Wenn Ihre Version 5.2.4 oder neuer ist, verwenden Sie:

display_errors = "stderr"

4

Abgesehen von error_reporting und der Einstellung display_errors ini können Sie SYNTAX-Fehler aus den Protokolldateien Ihres Webservers abrufen. Wenn ich PHP entwickle, lade ich die Webserver-Protokolle meines Entwicklungssystems in meinen Editor. Immer wenn ich eine Seite teste und einen leeren Bildschirm erhalte, wird die Protokolldatei veraltet und mein Editor fragt, ob ich sie neu laden möchte. Wenn ich das tue, springe ich nach unten und es gibt einen Syntaxfehler. Zum Beispiel:

[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

Für diejenigen, die Nginx verwenden und einen weißen Bildschirm haben, auch für Dateien mit <?php echo 123;. In meinem Fall hatte ich diese erforderliche Option für PHP in der Nginx-Konfigurationsdatei nicht:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

Diese Option war nicht in der Datei fastcgi_params enthalten, daher funktionierte PHP nicht und es gab keine Fehler in den Protokollen.


Ich hatte das gleiche Problem und es liegt daran, dass in der Nginx-Standardkonfigurationsdatei diese Zeile fehlt.
Salem
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.