debugging title - Wie bekomme ich nützliche Fehlermeldungen in PHP?



tag definition (24)

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?


Answers

Mein übliches Problem sind "kleine, blöde" Parserfehler, die leider nicht auftauchen.

Wenn eine .PHP-Datei jedoch eine Datei mit Parserfehlern enthält, werden diese angezeigt! Ich hatte also die Idee, ein kleines "Executor-Skript" zu schreiben, das mit dem Namen der Buggy-Datei als Argument gestartet wird, zB example.com/sx.php?sc=buggy.php

Es hat mich schon vor vielen Kopfschmerzen gerettet, vielleicht wird es auch für jemand anderen hilfreich sein :)

sx.php

$sc = $_GET["sc"];
if ((!isset($_GET["sc"]) && empty($_GET["sc"]))) {
    echo "Please select file to execute using ?sc= (you may omit the .PHP-extension)";
} else {
    $sc = $_GET["sc"];
    if (false==stripos('.php',$sc)) $sc.='.php';  // adjust this if your preferred extension is php5!
    require($sc);
}
?>

Um dies zu erhalten und es confortale zu machen, können Sie Ihre php.ini Datei bearbeiten. Es wird normalerweise in /etc/php.ini oder /etc/php/php.ini gespeichert, aber mehr lokale php.ini 's können es überschreiben, abhängig von den Setup-Richtlinien Ihres Hosting-Providers. Überprüfen Sie eine phpinfo() Datei für Loaded Configuration File an der Spitze, um sicher zu sein, welche zuletzt geladen wurde.

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

Ändern Sie die unkommentierte Zeile zu:

display_errors = stdout

Bei Syntaxfehlern müssen Sie die Fehleranzeige in der php.ini aktivieren. Standardmäßig sind diese deaktiviert, weil Sie nicht möchten, dass ein "Kunde" die Fehlermeldungen sieht. Auf dieser Seite in der PHP-Dokumentation finden Sie Informationen zu den zwei Direktiven: error_reporting und display_errors . display_errors ist wahrscheinlich der, den Sie ändern möchten. Wenn Sie die php.ini nicht ändern können, können Sie auch die folgenden Zeilen zu einer .htaccess-Datei hinzufügen:

php_flag  display_errors        on
php_value error_reporting       2039

Sie sollten in Erwägung ziehen, den Wert von E_ALL (wie von Gumbo erwähnt) für Ihre PHP-Version für error_reporting zu verwenden, um alle Fehler zu erhalten. Mehr Info

3 andere Punkte: (1) Sie können die Fehlerprotokolldatei überprüfen, da sie alle Fehler enthält (sofern die Protokollierung nicht deaktiviert wurde). (2) Durch Hinzufügen der folgenden zwei Zeilen können Sie Fehler beheben, bei denen es sich nicht um Syntaxfehler handelt:

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

(3) Eine weitere Option ist die Verwendung eines Editors, der bei der PhpEd nach Fehlern PhpEd , z. B. PhpEd . PhpEd kommt auch mit einem Debugger, der detailliertere Informationen liefern kann. (Der PhpEd Debugger ist sehr ähnlich zu xdebug und integriert sich direkt in den Editor, so dass Sie mit einem Programm alles machen können.)

Cartmans link ist auch sehr gut: link


http://todell.com/debug kann auch nützlich sein. Sie können Ihre Objektwerte oder geworfene Debug-Fehler auch im Produktionsmodus hinter der Szene sehen.


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 .


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


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

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



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

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) { /* ... */

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



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


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

error_reporting(E_ALL | E_STRICT);

Und schalte Anzeigefehler in php.ini ein


Die "FEHLER" sind die nützlichsten Dinge für die Entwickler, um ihre Fehler zu erkennen und sie zu lösen, damit das System perfekt funktioniert.

PHP bietet einige bessere Möglichkeiten, die Entwickler zu verstehen, warum und wo ihr Code die Fehler erhält. Wenn Entwickler diese Fehler kennen, können sie ihren Code in vielerlei Hinsicht verbessern.

Die besten Möglichkeiten, die folgenden zwei Zeilen am Anfang des Skripts zu schreiben, um alle Fehlermeldungen zu erhalten:

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

Eine weitere Möglichkeit, Debugger-Tools wie Xdebug in Ihrer IDE zu verwenden.


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

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

am Anfang des Skripts, das unter Fehlersuche steht. Das ist nicht perfekt, die perfekte Variante ist, dass Sie dies auch in der php.ini und die Fehler in PHP protokollieren, um Syntax- und Startfehler zu erkennen.

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

Nächste Dinge zu beachten:

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

Siehe auch:


Wählen Sie oben auf der Seite einen Parameter aus

error_reporting(E_ERROR | E_WARNING | E_PARSE);

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 .


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

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.


unset($array[$index]);




php debugging error-handling