titel Wie bekomme ich nützliche Fehlermeldungen in PHP?




wordpress seo titel (19)

Ich finde Programmierung in PHP ziemlich frustrierend. Ziemlich oft werde ich versuchen, das Skript auszuführen und nur einen leeren Bildschirm zurück zu bekommen. Keine Fehlermeldung, nur 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 falsch gelaufen ist. Am Ende höre ich den Code aus, gebe überall "Echo" -Einträge ein und versuche das Problem einzugrenzen. Aber es muss sicherlich einen besseren Weg geben, oder?

Gibt es eine Möglichkeit, PHP dazu zu bringen, nützliche Fehlermeldungen wie Java zu erzeugen? Kann jemand gute PHP-Debugging-Tipps, Tools und Techniken empfehlen?

https://code.i-harness.com


PHP-Konfiguration

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

  1. display_errors
  2. error_reporting

In der Produktion wird display_errors normalerweise auf Off (was eine gute Sache ist, da eine Fehleranzeige in Produktionsstandorten im Allgemeinen nicht erwünscht ist!).

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

error_reporting (ab PHP 5.3) ist standardmäßig auf E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED (dh es wird alles angezeigt, mit Ausnahme von Hinweisen, strengen Standards und Verwarnungen). E_ALL Sie im Zweifelsfall E_ALL , um alle Fehler anzuzeigen. Überprüfen Sie !

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

Das ist eine Schande. Gewöhnlich freigegebene Hosts erlauben keine Änderung ihrer php.ini-Datei, und daher ist diese Option leider nicht verfügbar. Aber fürchte dich nicht! Wir haben andere Möglichkeiten!

Laufzeitkonfiguration

Im gewünschten Skript können wir die php.ini Einträge in Runtime ä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 zwei Zeilen haben den gleichen Effekt wie die php.ini Einträge wie oben beschrieben zu ändern! Genial!

Ich bekomme immer noch eine leere Seite / 500 Fehler!

Das bedeutet, dass das Skript nicht einmal gelaufen ist! Das passiert normalerweise, wenn Sie einen Syntaxfehler haben!

Bei Syntaxfehlern kommt das Skript nicht einmal zur Laufzeit. Es schlägt bei der Kompilierung fehl, was bedeutet, dass es die Werte in der php.ini verwendet, die, wenn Sie nicht geändert wurden, möglicherweise die Anzeige von Fehlern nicht erlauben.

Fehlerprotokolle

Darüber hinaus protokolliert PHP standardmäßig Fehler. Beim Shared Hosting kann es sich in einem speziellen Ordner oder in demselben Ordner befinden wie das problematische Skript.

Wenn Sie Zugriff auf die php.ini haben, können Sie sie unter dem Eintrag error_log .


Abgesehen von error_reporting und der Einstellung display_errors ini können Sie SYNTAX-Fehler von den Protokolldateien Ihres Webservers erhalten. Wenn ich PHP entwickle, lade ich die Webserver-Logs 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, spring ich nach unten und da ist der Syntaxfehler. Beispielsweise:

[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


Das Aktivieren der Fehlerberichterstattung ist die richtige Lösung, scheint jedoch nicht in dem Programm wirksam zu sein, das sie aktiviert, sondern nur in den nachfolgenden Programmen.

Daher erstelle ich immer eine Datei / ein Programm (das ich normalerweise "genwrap.php" nenne), das im Wesentlichen den gleichen Code wie die populäre Lösung hier hat (dh Fehlerbericht einschalten) und es schließt dann auch die Seite ein, die ich eigentlich haben möchte Anruf.

Es gibt 2 Schritte, um dieses Debugging zu implementieren;

One - create genwrap.php und lege diesen Code hinein:

<?php
error_reporting(-1);
ini_set('display_errors', 'On');

include($_REQUEST['page']);
?>

Zwei - ändern Sie den Link zu dem Programm / der Seite, die Sie debuggen möchten, über genwrap.php,

ZB: ändern:

$.ajax('dir/pgm.php?param=val').done(function(data) { /* ... */

zu

$.ajax('dir/genwrap.php?page=pgm.php&param=val').done(function(data) { /* ... */

Die zwei Schlüsselzeilen, die Sie brauchen, um nützliche Fehler aus PHP zu bekommen, sind:

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

Wie von anderen Mitwirkenden hervorgehoben, sind diese aus Sicherheitsgründen standardmäßig ausgeschaltet. Als nützlicher Tipp: Wenn Sie Ihre Site einrichten, ist es praktisch, einen Switch für Ihre verschiedenen Umgebungen zu verwenden, damit diese Fehler standardmäßig in Ihren lokalen und Entwicklungsumgebungen aktiviert sind. Dies kann mit folgendem Code erreicht werden (idealerweise in Ihrer index.php oder config-Datei, 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;
}

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



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



Sie können Ihren eigenen Fehlerhandler in PHP registrieren. Wenn Sie beispielsweise alle Fehler in einer Datei ablegen, können Sie in diesen obskuren Fällen Abhilfe schaffen. Beachten Sie, dass Ihre Funktion aufgerufen wird, unabhängig davon, auf welche Ihrer aktuellen error_reporting Sie error_reporting . 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');

Sie können die vollständige Fehlerberichterstattung aktivieren (einschließlich Benachrichtigungen und strikte Nachrichten). Manche Leute finden das zu ausführlich, aber es ist einen Versuch wert. Setzen Sie error_reporting auf E_ALL | E_STRICT E_ALL | E_STRICT in deiner 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 möchten, aber andere Nachrichtentypen hilfreich sind, versuchen Sie, Hinweise auszuschließen:

error_reporting = (E_ALL | E_STRICT) & ~E_NOTICE

display_errors außerdem sicher, dass display_errors in der php.ini display_errors ist. Wenn Ihre PHP-Version älter als 5.2.4 ist, setzen Sie sie auf On :

display_errors = "On"

Wenn Ihre Version 5.2.4 oder neuer ist, verwenden Sie:

display_errors = "stderr"

Um die vollständige Fehlerberichterstattung zu aktivieren, fügen Sie diese Ihrem Skript hinzu:

error_reporting(E_ALL);

Dadurch werden selbst minimale Warnungen angezeigt. Und nur für den Fall:

ini_set('display_errors', '1');

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


Vielleicht möchten Sie auch PHPStorm als Ihren Code-Editor ausprobieren. Es wird viele PHP- und andere Syntaxfehler finden, wenn Sie im Editor tippen.


Wählen Sie oben auf der Seite einen Parameter aus

error_reporting(E_ERROR | E_WARNING | E_PARSE);

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. Sie erhalten auch die Variable test_server, die Sie gegebenenfalls an anderen Stellen verwenden können.

Alle Fehler, die vor der Ausführung des Skripts auftreten, werden nicht abgefangen, aber für 99% der Fehler, die ich mache, ist das kein Problem.


Zusätzlich zu den vielen ausgezeichneten Antworten können Sie auch die folgenden zwei Funktionen in Ihren Projekten implementieren. Sie fangen jeden Nicht-Syntaxfehler vor dem Beenden der Anwendung / des Skripts ab. Innerhalb der Funktionen können Sie ein Backtrace durchführen und eine angenehme 'Site wird gewartet' Nachricht an die Öffentlichkeit protokollieren oder rendern.

Fatale Fehler:

register_shutdown_function

http://php.net/manual/en/function.register-shutdown-function.php

Fehler:

set_error_handler

http://php.net/manual/en/function.set-error-handler.php

Rückverfolgung:

debug_backtrace

http://php.net/manual/en/function.debug-backtrace.php


FirePHP kann auch nützlich sein.


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

Außerdem können Sie mit xdebug detailliertere Informationen erhalten .


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




error-handling