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

17voto

Rich Bradshaw Punkte 69394

Wenn du super cool bist, kannst du es 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);

Dadurch werden nur Fehler angezeigt, wenn Sie lokal arbeiten. Außerdem erhalten Sie damit 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 bei 99 % der Fehler, die ich mache, ist das kein Problem.

2 Stimmen

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 Produktions-Website in ihrer Produktionsumgebung debuggen müssen und nur die Fehler sehen wollen, verwenden Sie $_SERVER['REMOTE_HOST'] um zu überprüfen, ob der Kunde, nun ja, Sie sind.

17voto

Kld Punkte 6718

Wählen Sie oben auf der Seite einen Parameter aus

error_reporting(E_ERROR | E_WARNING | E_PARSE);

17voto

Sherif Punkte 11485

Dies ist ein Problem der geladenen Konfiguration gegenüber der Laufzeitkonfiguration

Es ist wichtig zu erkennen, dass ein Syntaxfehler oder ein Parse-Fehler während der kompilieren o Parsing Schritt, was bedeutet, dass PHP den Vorgang abbricht, bevor es überhaupt die Chance hatte, Ihren Code auszuführen. Wenn Sie also PHPs display_errors Konfiguration während der Laufzeit (dies umfasst alles von der Verwendung ini_set in Ihrem Code auf die Verwendung von .htaccess, einer Laufzeitkonfigurationsdatei, umstellen, dann wird nur der Standard geladene Konfigurationseinstellungen sind im Spiel.

Wie man WSOD in der Entwicklung immer vermeidet

Um einen WSOD zu vermeiden, müssen Sie sicherstellen, dass Ihr geladene Konfigurationsdatei hat display_errors an und error_reporting eingestellt auf -1 ( dies ist das Äquivalent zu E_ALL, da es sicherstellt, dass alle Bits aktiviert sind, unabhängig davon, welche PHP-Version Sie verwenden ). Geben Sie den konstanten Wert von E_ALL nicht fest ein, da sich dieser Wert zwischen verschiedenen PHP-Versionen ändern kann.

Geladene Konfiguration ist entweder Ihre geladene php.ini Datei oder Ihr apache.conf o httpd.conf oder der Datei virtualhost. Diese Dateien werden nur einmal während der Startphase gelesen (z. B. beim ersten Start von apache httpd oder php-fpm) und nur durch Konfigurationsänderungen zur Laufzeit überschrieben. Stellen Sie sicher, dass display_errors = 1 y error_reporting = -1 in Ihrer geladenen Konfigurationsdatei stellt sicher, dass Sie niemals eine WSOD unabhängig von Syntax- oder Parse-Fehlern, die vor einer Laufzeitänderung auftreten, wie ini_set('display_errors', 1); o error_reporting(E_ALL); stattfinden kann.

Wie Sie Ihre (php.ini) geladenen Konfigurationsdateien finden

Um Ihre geladene(n) Konfigurationsdatei(en) zu finden, erstellen Sie einfach eine neue PHP-Datei, die nur den folgenden Code enthält...

<?php
phpinfo();

Richten Sie dann Ihren Browser dorthin und sehen Sie sich Geladene Konfigurationsdatei y Zusätzliche .ini-Dateien geparst die normalerweise an der Spitze Ihrer phpinfo() und enthält den absoluten Pfad zu allen geladenen Konfigurationsdateien.

Wenn Sie sehen (none) anstelle der Datei, bedeutet das, dass Sie keine php.ini in Pfad der Konfigurationsdatei (php.ini) . Sie können also Laden Sie die mit PHP gebündelte php.ini von hier herunter und kopieren Sie sie als php.ini in den Pfad Ihrer Konfigurationsdatei. Stellen Sie dann sicher, dass Ihr php-Benutzer über ausreichende Rechte verfügt, um diese Datei zu lesen. Sie müssen httpd oder php-fpm neu starten, um die Datei zu laden. Denken Sie daran, dies ist die Entwicklung php.ini-Datei, die mit dem PHP-Quellcode mitgeliefert wird. Verwenden Sie sie also bitte nicht in der Produktion!


Tun Sie dies einfach nicht in der Produktion

Dies ist wirklich der beste Weg, um einen WSOD in der Entwicklung zu vermeiden. Jeder, der vorschlägt, dass Sie die ini_set('display_errors', 1); o error_reporting(E_ALL); am Anfang Ihres PHP-Skripts oder die Verwendung von .htaccess, wie Sie es hier getan haben, wird Ihnen nicht helfen, einen WSOD zu vermeiden, wenn ein Syntax- oder Parse-Fehler auftritt (wie in Ihrem Fall hier), wenn Ihre geladene Konfigurationsdatei display_errors ausgeschaltet.

Viele Leute (und Standardinstallationen von PHP) verwenden eine production-ini-Datei, die display_errors standardmäßig deaktiviert, was in der Regel zu der gleichen Frustration führt, die Sie hier erlebt haben. Denn PHP hat es bereits ausgeschaltet, wenn es startet, dann einen Syntax- oder Parse-Fehler feststellt und mit nichts in der Ausgabe zurückkommt. Sie erwarten, dass Ihr ini_set('display_errors',1); am Anfang Ihres PHP-Skripts sollte das verhindern, aber es macht nichts, wenn PHP Ihren Code nicht parsen kann, weil er die Laufzeitumgebung nie erreicht hat.

16voto

Eli Punkte 93336

Ich weiß nicht, ob es helfen wird, aber hier ist ein Teil meiner Standard-Konfigurationsdatei für PHP-Projekte. Ich neige dazu, mich nicht zu sehr auf die Apache-Konfigurationen zu verlassen, auch nicht auf meinem eigenen Server.

Ich habe das Problem mit den verschwindenden Fehlern nie, aber vielleicht können Sie sich hier etwas abschauen.

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

0 Stimmen

@Eli, Das hat allerdings einen Laufzeit-Overhead, pro Seitenanfrage .

0 Stimmen

Up 1 für das Konzept, dass Debug-Einstellungen zu übersehen, wie auch immer Server konfiguriert ist, gut, während Sie bereitstellen oder pflegen (in der Entwicklung)

16voto

Ram Punkte 1151

Um dies beizubehalten, können Sie Ihre php.ini-Datei bearbeiten. Sie ist normalerweise gespeichert in /etc/php.ini o /etc/php/php.ini sondern eher lokal php.ini überschreibt sie möglicherweise, je nach den Einrichtungsrichtlinien Ihres Hosting-Providers. Prüfen Sie eine phpinfo() Datei für Loaded Configuration File an der Spitze, um sicher zu sein, dass sie zuletzt geladen wird.

Suchen Sie in dieser Datei nach display_errors. Es sollte nur 3 Instanzen geben, von denen 2 kommentiert sind.

Ändern Sie die unkommentierte Zeile in:

display_errors = stdout

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