650 Stimmen

Wie kann ich nützliche Fehlermeldungen in PHP erhalten?

Oft versuche ich, ein PHP-Skript auszuführen, und erhalte nur einen leeren Bildschirm zurück. Keine Fehlermeldung, nur ein leerer Bildschirm. Die Ursache könnte ein einfacher Syntaxfehler (falsche Klammer, fehlendes Semikolon), ein fehlgeschlagener Funktionsaufruf oder etwas ganz anderes sein.

Es ist sehr schwierig, herauszufinden, was schief gelaufen ist. Am Ende muss ich Code auskommentieren, überall "echo"-Anweisungen eingeben 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 auszugeben, wie es Java tut?

1 Stimmen

5 Stimmen

@JuannStrauss, Das ist noch untertrieben. Und wenn Sie schließlich siehe die Fehler, es heißt T_PAAMAYIM_NEKUDOTAYIM . Oder vielleicht "muss eine Instanz von integer sein, integer gegeben" .

2 Stimmen

532voto

Darryl Hein Punkte 138311

Für Syntaxfehler müssen Sie die Fehleranzeige in der php.ini aktivieren. Standardmäßig sind sie ausgeschaltet, weil Sie nicht wollen, dass ein "Kunde" die Fehlermeldungen sieht. Überprüfen Sie diese Seite in der PHP-Dokumentation für Informationen zu den 2 Direktiven: error_reporting y display_errors . display_errors ist wahrscheinlich diejenige, die Sie ändern möchten. Wenn Sie die php.ini nicht ändern können, können Sie auch die folgenden Zeilen in eine .htaccess-Datei einfügen:

php_flag  display_errors        on
php_value error_reporting       2039

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

3 weitere Punkte: (1) Sie können die Fehlerprotokolldatei überprüfen, da sie alle Fehler enthält (sofern die Protokollierung nicht deaktiviert wurde). (2) Das Hinzufügen der folgenden 2 Zeilen hilft Ihnen, Fehler zu beheben, die keine Syntaxfehler sind:

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

(3) Eine weitere Möglichkeit ist die Verwendung eines Editors, der bei der Eingabe auf Fehler prüft, z. B. PhpEd . PhpEd verfügt auch über einen Debugger, der detailliertere Informationen liefern kann. (Der PhpEd-Debugger ist xdebug sehr ähnlich und wird direkt in den Editor integriert, sodass Sie nur ein Programm für alles verwenden).

Cartman's Link ist ebenfalls sehr gut: http://www.ibm.com/developerworks/library/os-debug/

30 Stimmen

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/de/errorfunc.constants.php

0 Stimmen

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

2 Stimmen

Ich würde hinzufügen, dass die Protokollierung von Fehlern in einer Datei (und die Suche nach ihnen dort) die beste Lösung ist. Verlassen Sie sich nicht auf die Anzeige von Fehlern auf der Seite - sie können sie ruinieren, Sie können vergessen, die Fehlerberichterstattung für die Produktionsseite einzuschalten, und das wird Ihnen in Zukunft Probleme bereiten

472voto

Eljakim Punkte 6817

Im Folgenden sind alle Fehler aufgeführt:

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

Siehe auch die folgenden Links

29 Stimmen

Am besten nehmen Sie diese Änderungen auf der Ebene der .ini-Datei vor. Das Einschalten der Fehlerberichterstattung innerhalb eines Skripts ist nutzlos, da es bei Syntaxfehlern oder anderen schwerwiegenden Fehlern, die die Kompilierungsphase beenden, nicht weiterhilft. Das Skript wird beendet, lange bevor es mit der Ausführung beginnt und die Überschreibungen erreicht.

0 Stimmen

Sie haben in der Tat Recht. Ich habe nicht bemerkt, dass der Umzug auf Ihren eigenen Server erfolgt.

0 Stimmen

Versuchen Sie, die Datei php.ini zu finden, die verwendet wird. Auf meinem Ubuntu-Rechner ist sie in /etc/php5/apache2/php.ini gespeichert

179voto

m4dm4x1337 Punkte 1857

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, mit diesem Code eine leere Seite zu erzeugen, ist ein Fehler im Shutdown-Handler. Ich habe dies von meinem eigenen CMS kopiert und eingefügt, ohne es zu testen, aber ich bin sicher, dass es funktioniert.

4 Stimmen

Ich erhalte eine leere Seite mit diesem Code. Was meinen Sie mit "Sie haben einen Fehler in der Shutdown-Handler" und was sollte ich tun, um das Problem zu lösen?

0 Stimmen

@PaoloM, Er sagt einen Fehler in der Funktion ShutdownHandler oben. Im Grunde ist dies ein Notbehelf anstelle einer angemessenen Fehlerbehandlung.

0 Stimmen

Danke, das war nützlich, aber wie kann ich die E_NOTICE Fehler in dieser Funktion?

63voto

Tomalak Punkte 320467

Sie können die folgenden Zeilen in die Datei einfügen, die Sie debuggen möchten:

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

Dies setzt die Standardeinstellungen in der php.ini außer Kraft, die PHP nur dazu veranlassen, die Fehler in das Protokoll zu schreiben.

2 Stimmen

Das ist wahr. In diesem Fall müssen die Werte direkt in der Ini gesetzt werden - für eine reine Entwicklungsumgebung ist dies vielleicht ohnehin vorzuziehen.

61voto

James Anderson Punkte 26827

Fehler und Warnungen erscheinen normalerweise in ....\logs\php_error.log o ....\logs\apache_error.log abhängig von Ihren php.ini-Einstellungen.

Auch nützliche Fehler werden oft an den Browser weitergeleitet, aber da sie keine gültige HTML sind, werden sie nicht angezeigt.

Also "tail -f "Wenn Sie einen leeren Bildschirm erhalten, verwenden Sie die IE-Menüoptionen "Ansicht" -> "Quelle", um die Rohdaten anzuzeigen.

13 Stimmen

Leider wird auch bei der Ansicht des Seitenquelltextes nichts angezeigt.

2 Stimmen

Parse-Fehler sollten im Fehlerprotokoll des Apache sichtbar sein, unabhängig davon, welche Einstellung Sie sonst noch haben. Wenn Sie keine Kontrolle über den Server haben, könnte es schwierig sein, das Apache-Fehlerprotokoll zu erhalten, aber ich schlage vor, dass Sie mit Ihrem Provider sprechen, und es gibt Möglichkeiten, Ihnen das Fehlerprotokoll zugänglich zu machen. Ansonsten kann ich nur vorschlagen, was andere bereits getan haben: Überprüfen Sie Ihren Code auf Parsing-Fehler auf Ihrem lokalen Entwicklungsserver, bevor Sie ihn in der Produktion einsetzen. Auch eine validierende IDE wie PDT von Eclipse könnte eine große Hilfe sein.

5 Stimmen

Um darauf zurückzukommen: Ich hatte kürzlich ein Stack-Overflow-Problem, das keine Fehler erzeugte, auch nicht in den Protokollen, und sich nicht als solches manifestierte, bis ich xdebug auf dem Server installierte. Oh je.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X