Frage

Nun, da ich fange wieder in PHP zu bekommen, ich fange an zu erinnern, warum ich es in erster Linie aufgab. Das nervigste auf meinem Teller im Moment ist das, was ich „weißer Bildschirm des Todes von PHP“ zu Ausdruck gekommen sind. Wenn PHP einen fatalen Fehler aufgrund Syntax bekommt oder was auch immer, scheint es, wie es sterben immer, ohne etwas an den Browser tatsächlich gesendet wird. Ich habe folgendes meine .htaccess hinzugefügt, und es scheint die meiste Zeit zu arbeiten, aber es funktioniert nicht in diesen Fällen.

php_value display_errors 1
php_value display_startup_errors 1
php_value error_reporting 2147483647 # E_ALL

Bin ich etwas fehlt? Im Moment fühle ich mich wie Refresh alle paar Zeilen Code schlagen muss ich schreiben, damit ich einen Fehler machen und haben durch viele Seiten suchen, versuchen, ausfindig zu machen, dass ein kleiner Fehler, den ich gemacht ...

EDIT: Zum Beispiel, da die beiden folgenden Codezeilen:

$foo = array(':language' => $languageId;
$foo = array(':language' => $languageId);

Die erste wird die weiße Bildschirm des Todes (dh gar nichts gedruckt an den Browser) aufweisen, während die zweite glücklich ausgeführt wird.

War es hilfreich?

Lösung

Fehler und Warnungen in der Regel erscheinen in ....\logs\php_error.log oder ....\logs\apache_error.log je nach php.ini Einstellungen.

Auch nützlich Fehler werden oft an den Browser gerichtet, aber da sie nicht gültig html sind, werden sie nicht angezeigt.

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

Andere Tipps

Der folgende Code sollte alle Fehler angezeigt werden:

<?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, wenn Sie einen Fehler in den Shutdown-Handler haben. Ich kopierte und die aus eigener cms ohne vorher zu testen, aber ich bin sicher, dass es funktioniert.

Ich verwende immer diese Syntax an der Spitze des PHP-Skript.

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

Es ist möglich, einen Haken zu registrieren, um die letzten Fehler zu machen oder eine Warnung sichtbar.

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

register_shutdown_function('shutdown');

Hinzufügen von Code zu Beginn Sie index.php wird Ihnen helfen, die Probleme zu debuggen.

Dies ist ein Problem der geladenen vs. Laufzeitkonfiguration

Es ist wichtig, dass ein Syntaxfehler zu erkennen oder analysieren, Fehler während der geschehen Compile oder Parsen Schritt, was bedeutet, dass PHP zu retten, bevor es überhaupt eine Chance hatte auszuführen jeder Code. Also, wenn Sie während der Laufzeit von PHP display_errors Konfiguration modifizieren, (dies alles enthält verwenden ini_set in Ihrem Code mit .htaccess, die eine Laufzeit-Konfigurationsdatei ist), dann nur den Standard geladene Konfigurationseinstellungen sind im Spiel .

Wie immer WSOD in der Entwicklung vermeiden

ein WSOD Sie sicherstellen möchten, zu vermeiden, dass Ihr geladen Konfigurationsdatei hat display_errors auf und error_reporting auf -1 ( Dies ist das Äquivalent E_ALL, weil es alle Bits gewährleistet, unabhängig eingeschaltet von der Version von PHP Sie laufen ). Sie nicht den konstanten Wert von E_ALL codieren, da dieser Wert unterliegt zwischen verschiedenen Versionen von PHP ändern.

Loaded Konfiguration ist entweder Ihre geladene php.ini Datei oder Ihre apache.conf oder httpd.conf oder Virtualhost-Datei. Diese Dateien werden gelesen nur einmal während der Startstufe (beim ersten Apache oder PHP-FPM, zum Beispiel Start) und nur durch Laufzeit-Konfigurationsänderungen außer Kraft gesetzt. Sicherzustellen, dass display_errors = 1 und error_reporting = -1 in der geladenen Konfigurationsdatei sorgen dafür, dass Sie nie ein WSOD unabhängig von Syntax oder analysieren Fehler sehen, die vor einer Laufzeitänderung auftreten wie ini_set('display_errors', 1); oder error_reporting(E_ALL); stattfinden kann.

Wie Sie Ihre (php.ini) geladen Konfigurationsdateien

finden

Ihre geladene Konfigurationsdatei finden (s) gerade eine neue PHP-Datei erstellen, nur mit dem folgenden Code ...

<?php
phpinfo();

zeigen Sie Ihren Browser dort und Blick auf Loaded Configuration File und Zusätzliche INI-Dateien analysiert , die in der Regel an der Spitze Ihres phpinfo() sind und den absoluten Pfad enthalten auf alle Ihre geladenen Konfigurationsdateien.

Wenn Sie (none) anstelle der Datei angezeigt wird, bedeutet, dass Sie nicht über ein php.ini in Konfigurationsdatei (php.ini) Pfad . So können Sie die Lager php.ini mit PHP gebündelt hier herunterladen und kopieren dass an den Konfigurationsdateipfad als php.ini dann stellen Sie sicher, dass Ihre pHP-Benutzer über ausreichende Berechtigungen aus dieser Datei zu lesen. Sie müssen httpd oder php-fpm neu zu starten, um es zu laden in. Denken Sie daran, das ist die Entwicklung php.ini-Datei, die mit dem PHP-Source mitgeliefert wird. Also bitte nicht in der Produktion verwenden!


Just tut dies nicht in Produktion

Das ist wirklich der beste Weg, um eine WSOD in der Entwicklung zu vermeiden. Wer darauf hindeutet, dass Sie ini_set('display_errors', 1); oder error_reporting(E_ALL); an der Spitze Ihres PHP-Skripts setzen oder mit .htaccess wie Sie hier haben, ist nicht zu Ihnen helfen, eine WSOD zu vermeiden, wenn eine Syntax oder analysieren Fehler (wie in Ihrem Fall hier), wenn Ihr loaded auftreten Konfigurationsdatei display_errors ausgeschaltet.

Viele Menschen (und Lager Installationen von PHP) werden eine Produktions-ini-Datei verwenden, die display_errors standardmäßig deaktiviert hat, die in der Regel in der gleichen Frustration führt Sie hier erlebt hat. Da PHP bereits es ausgeschaltet, wenn er startet, trifft dann eine Syntax oder Fehler analysieren und bails mit nichts ausgeben. Sie erwarten, dass Ihre ini_set('display_errors',1); an der Spitze Ihres PHP-Skript hätte vermieden werden sollten, aber es wird keine Rolle, ob PHP Ihren Code nicht analysieren kann, weil sie nie die Laufzeit erreicht haben.

Keine Ahnung, ob es hilft, aber hier ist ein Stück meiner Standard-Konfigurationsdatei für PHP-Projekte. Ich neige dazu, nicht zu sehr auf der Apache configs auf meinem eigenen Server selbst abhängig zu sein.

ich nie das Verschwinden Fehler Problem hat, so vielleicht hier etwas gibt Ihnen eine Idee.

Herausgegeben APPLICATON_LIVE zeigen

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

php.ini öffnen, sicherstellen, dass es auf:

display_errors = On

Starten Sie Ihren Server.

Für diejenigen, die nginx verwenden und haben einen weißen Bildschirm auch für Datei mit <?php echo 123;. In meinem Fall habe ich nicht diese gewünschte Option für PHP haben in nginx config-Datei:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

war diese Option nicht in fastcgi_params Datei, so dass PHP hat nicht funktioniert und es gab keine Fehler in Protokollen.

Versuchen Sie, die Fehlerberichterstattung Ebene in Ihren aktuellen PHP-Dateien zu setzen. Oder, wie andere vorgeschlagen haben, überprüfen Sie die Servereinstellungen - es ist etwas in der php.ini sein könnte, oder einige Einschränkung als Gastgeber betrifft. Nicht nur auf .htaccess verlassen. Auch bei der Fehlersuche, print_r alle Variablen, könnte man denken, fischig.

Sind Sie sicher, dass PHP tatsächlich Abheben des ‚display_errors‘ von .htaccess-Einstellung? Überprüfen Sie die Ausgabe der phpinfo() Funktion, um sicherzustellen.

Außerdem sollten Sie überprüfen, um sicherzustellen, dass Sie nicht ‚@‘ verwendet haben, könnte es Ihre Fehler werden zum Schweigen zu bringen, wenn Sie verwendet haben ‚@include ...‘ oder ‚@some_function (...)‘, irgendwo auf den Stack-Trace.

Einige Anwendungen behandeln Sie diese Anweisungen selbst, durch so etwas wie dieser Aufruf:

error_reporting(E_ALL & ~E_DEPRECATED); or error_reporting(0);

Und so überschreibt die .htaccess-Einstellungen.

mit @inexistent_function_call(); in Ihrem Code bewirkt, dass der Interpreter zu leise sterben und das Skript Parsing abbrechen. Sie sollten für ungültige Funktionen überprüfen und versuchen, nicht den Fehler-Operator Der Rauschunterdrückung (das @ Zeichen) zu verwenden,

Ich habe auch solche Fehler, wenn die fastcgi_params oder fastcgi.conf Konfigurationsdatei wird in der Serverkonfiguration nicht ordnungsgemäß eingeschlossen gesehen. So ist die Lösung für mich war eine dumme:

include /etc/nginx/fastcgi_params;

Habe mir eine Stunde , um das herauszufinden ...

Sie können die Datei auch im Terminal (Befehlszeile) laufen wie folgt:. php -f filename.php

Dies läuft Ihren Code und gibt Ihnen die gleiche Leistung im Fall von Fehlern, die Sie in der error.log sehen würden. Er erwähnt den Fehler und die Zeilennummer.

Wenn der Fehler in PHP-Code ist, können Sie error_reporting () Funktion in Ihrem Code verwenden, um alle auf den Bericht zu setzen.

Allerdings bedeutet dies die Situation nicht umgehen, wenn PHP abstürzt. Informationen über das ist nur in Server-Logs zur Verfügung. Vielleicht haben Sie keinen Zugriff auf diejenigen, aber viele Hosting-Provider Ich habe mit irgendeiner Weise gearbeitet haben Sie darauf zugreifen zu lassen. Zum Beispiel ist der Ansatz, den ich am besten gefällt, dass es die error_log-Datei im aktuellen Verzeichnis erstellt, wo .php befindet. Versuchen Sie es suchen oder kontaktieren Sie Ihren Hosting-Provider darüber.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top