it-swarm.com.de

Wie bekomme ich nützliche Fehlermeldungen in PHP?

Ich finde die Programmierung in PHP ziemlich frustrierend. Sehr oft werde ich versuchen, das Skript auszuführen und bekomme nur einen leeren Bildschirm zurück. Keine Fehlermeldung, nur leerer Bildschirm. Die Ursache könnte ein einfacher Syntaxfehler (falsche Klammer, fehlendes Semikolon) oder ein fehlgeschlagener Funktionsaufruf oder etwas ganz anderes sein.

Es ist sehr schwer herauszufinden, was schief gelaufen ist. Am Ende kommentiere ich Code aus, gebe überall "Echo" -Anweisungen ein usw., um das Problem einzugrenzen. Aber es muss doch einen besseren Weg geben, oder?.

Gibt es also eine Möglichkeit, PHP zu veranlassen, eine nützliche Fehlermeldung zu erzeugen, wie dies Java tut? Kann jemand gute PHP Debugging-Tipps und -Techniken empfehlen?

550
Candidasa

Für Syntaxfehler müssen Sie die Fehleranzeige in der php.ini aktivieren. Standardmäßig sind diese deaktiviert, da einem "Kunden" die Fehlermeldungen nicht angezeigt werden sollen. Diese Seite überprüfen In der Dokumentation zu PHP finden Sie Informationen zu den beiden Anweisungen: error_reporting und display_errors. display_errors ist wahrscheinlich derjenige, den Sie ändern möchten. Wenn Sie die php.ini nicht ändern können, können Sie einer .htaccess-Datei auch die folgenden Zeilen hinzufügen:

php_flag  display_errors        on
php_value error_reporting       2039

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

3 weitere Punkte: (1) Sie können die Fehlerprotokolldatei überprüfen, da sie alle Fehler enthält (es sei denn, die Protokollierung wurde deaktiviert). (2) Das Hinzufügen der folgenden 2 Zeilen hilft Ihnen beim Debuggen von Fehlern, die keine Syntaxfehler sind:

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

(3) Eine weitere Option ist die Verwendung eines Editors, der beim Eingeben auf Fehler prüft, z. B. PhpEd . PhpEd wird auch mit einem Debugger geliefert, der detailliertere Informationen liefern kann. (Der PhpEd-Debugger ist sehr ähnlich zu xdebug und wird direkt in den Editor integriert, sodass Sie 1 Programm verwenden, um alles zu erledigen.)

Cartmans link ist auch sehr gut: http://www.ibm.com/developerworks/library/os-debug/

479
Darryl Hein

Folgendes aktiviert alle Fehler:

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

Siehe auch die folgenden Links

440
Eljakim

Sie können die folgenden Zeilen in die zu debuggende Datei einfügen:

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

Dies überschreibt die Standardeinstellungen in der php.ini, die nur dazu führen, dass PHP die Fehler an das Protokoll meldet.

56
Tomalak

PHP-Konfiguration

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

  1. display_errors
  2. error_reporting

In production wird _display_errors_ normalerweise auf Off gesetzt (was eine gute Sache ist, da eine Fehleranzeige in Produktionsstätten im Allgemeinen nicht wünschenswert ist!).

In development ​​sollte es jedoch auf On gesetzt werden, damit Fehler angezeigt werden. Check!

_error_reporting_ (ab PHP 5.3) ist standardmäßig auf _E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED_ eingestellt (dh es wird alles außer Hinweisen, strengen Standards und Verfallserklärungen angezeigt). Stellen Sie im Zweifelsfall _E_ALL_ ein, um alle die Fehler anzuzeigen. Check!

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

Das ist eine Schande. Normalerweise erlauben freigegebene Hosts keine Änderungen an ihrer php.ini-Datei. Daher ist diese Option leider nicht verfügbar. Aber keine Angst! Wir haben andere Optionen !

Laufzeitkonfiguration

Im gewünschten Skript können wir die php.ini-Einträge zur Laufzeit ä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 beiden Zeilen haben den gleichen Effekt wie die oben beschriebenen Änderungen an den Einträgen in der php.ini! Genial!

Ich bekomme immer noch eine leere Seite/500 Fehler!

Das heißt, dass das Skript noch nicht einmal ausgeführt wurde! Das passiert normalerweise, wenn Sie einen Syntaxfehler haben!

Bei Syntaxfehlern erreicht das Skript nicht einmal die Laufzeit. Es schlägt fehl, um Kompilierzeit, was bedeutet, dass die Werte in der php.ini verwendet werden, die möglicherweise die Anzeige von Fehlern nicht zulassen, wenn Sie sie nicht geändert haben.

Fehlerprotokolle

Darüber hinaus protokolliert PHP standardmäßig Fehler. Beim Shared Hosting befindet es sich möglicherweise in einem dedizierten Ordner oder im selben Ordner wie das betreffende Skript.

Wenn Sie Zugriff auf die php.ini haben, finden Sie diese unter dem Eintrag error_log.

51
Madara Uchiha

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

30
gnarf

Für eine schnelle, praktische Fehlerbehebung empfehle ich hier normalerweise SO:

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

an den Anfang des Skripts gesetzt werden, das sich in der Fehlerbehebung befindet. Dies ist nicht perfekt, die perfekte Variante besteht darin, dass Sie dies auch im php.ini aktivieren und die Fehler in PHP protokollieren, um Syntax- und Startfehler abzufangen.

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

Nächste Dinge zu beachten:

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

Siehe auch:

25
hakre

Wählen Sie oben auf der Seite einen Parameter aus

error_reporting(E_ERROR | E_WARNING | E_PARSE);
16
Kld

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 auftreten, bevor das Skript ausgeführt wird, werden nicht abgefangen, aber für 99% der Fehler, die ich mache, ist das kein Problem.

16
Rich Bradshaw
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
15
Abuzer Firdousi

Um dies beizubehalten und es komfortabel zu machen, können Sie Ihre php.ini-Datei bearbeiten. Es wird normalerweise in /etc/php.ini oder /etc/php/php.ini gespeichert, aber je nach den Einrichtungsrichtlinien Ihres Hosting-Anbieters können mehr lokale php.ini es überschreiben. Überprüfen Sie eine phpinfo() -Datei auf Loaded Configuration File oben, um sicherzustellen, welche zuletzt geladen wird.

Suchen Sie in dieser Datei nach display_errors. Es sollten nur 3 Instanzen vorhanden sein, von denen 2 kommentiert sind.

Ändern Sie die nicht kommentierte Zeile in:

display_errors = stdout
15
Ram

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

Nette Tracy screenshot

13
Ondřej Šotek
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);
ini_set('html_errors', 1);

Darüber hinaus können Sie mit xdebug detailliertere Informationen erhalten.

13
Yan.Zero
error_reporting(E_ALL | E_STRICT);

Und aktivieren Sie Anzeigefehler in php.ini

10
Ólafur Waage

Sie können Ihren eigenen Fehlerbehandler in PHP registrieren. Das Ausgeben aller Fehler in eine Datei kann Ihnen beispielsweise in diesen undurchsichtigen Fällen helfen. Beachten Sie, dass Ihre Funktion aufgerufen wird, unabhängig davon, auf was Ihr aktuelles error_reporting eingestellt ist. 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');
9
soulmerge

Versuchen Sie dies Referenz-Tool für PHP-Fehlerberichte . Es ist eine sehr gute visuelle Referenz und hat mir geholfen, den komplexen Mechanismus der Fehlerberichterstattung zu verstehen.

7
Rodney McIntosh

Vielleicht möchten Sie auch PHPStorm als Ihren Code-Editor ausprobieren. Es werden viele PHP und andere Syntaxfehler direkt während der Eingabe im Editor gefunden.

6
user1681048

Die beiden wichtigsten Zeilen, die Sie benötigen, um nützliche Fehler aus PHP zu erhalten, sind:

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

Wie von anderen Mitwirkenden erwähnt, sind diese aus Sicherheitsgründen standardmäßig deaktiviert. Ein nützlicher Tipp: Wenn Sie Ihre Site einrichten, ist es praktisch, einen Wechsel für Ihre verschiedenen Umgebungen durchzuführen, sodass diese Fehler in Ihrer lokalen Umgebung und in Ihrer Entwicklungsumgebung standardmäßig aktiviert sind. Dies kann mit dem folgenden Code erreicht werden (idealerweise in Ihrer index.php- oder config-Datei, damit dies 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;
}
6
Code Synthesis

FirePHP kann auch nützlich sein.

6
Rich Bradshaw

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

hier werden die letzten 50 Fehler angezeigt. Es gibt eine Fehlerdatei error.log für Apache2, die alle Fehler protokolliert.

5
Ashutosh Jha

Fügen Sie Ihrem Skript Folgendes hinzu, um die vollständige Fehlerberichterstattung zu aktivieren:

error_reporting(E_ALL);

Dadurch werden selbst minimale Warnungen angezeigt. Und für alle Fälle:

ini_set('display_errors', '1');

Erzwingt die Anzeige von Fehlern. Dies sollte auf Produktionsservern deaktiviert sein, jedoch nicht bei der Entwicklung.

4

Sie können die vollständige Fehlerberichterstattung aktivieren (einschließlich Benachrichtigungen und strenger Nachrichten). Einige Leute finden das zu ausführlich, aber es ist einen Versuch wert. Setze error_reporting in deiner php.ini auf E_ALL | E_STRICT.

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 erhalten möchten, andere Nachrichtentypen jedoch hilfreich sind, schließen Sie die Benachrichtigungen aus:

error_reporting = (E_ALL | E_STRICT) & ~E_NOTICE

Stellen Sie außerdem sicher, dass display_errors in der php.ini aktiviert 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"
4
Ayman Hourieh

Die “FEHLER” sind die nützlichsten Dinge für die Entwickler, um ihre Fehler zu kennen und sie zu beheben, damit das System einwandfrei funktioniert.

PHP bietet einige bessere Möglichkeiten, um die Entwickler darüber zu informieren, warum und wo ihr Code die Fehler abruft. Wenn Entwickler diese Fehler kennen, können sie ihren Code auf viele Arten verbessern.

Am besten schreiben Sie die folgenden zwei Zeilen oben im Skript, um alle Fehlermeldungen zu erhalten:

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

Eine andere Möglichkeit, Debugger-Tools wie xdebug in Ihrer IDE zu verwenden.

3
user3176739

Abgesehen von der Einstellung error_reporting und display_errors ini können Sie SYNTAX-Fehler aus den Protokolldateien Ihres Webservers abrufen. Wenn ich PHP entwickle, lade ich die Webserver-Logs meines Entwicklungssystems in meinen Editor. Wenn ich eine Seite teste und ein leerer Bildschirm angezeigt wird, ist die Protokolldatei veraltet und mein Editor fragt, ob ich sie neu laden möchte. Wenn ich das tue, springe ich nach unten und es gibt einen Syntaxfehler. Zum Beispiel:

[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
3
jmucchiello

Diese Antwort erhalten Sie von der Redundanzabteilung.

  1. ini_set()/php.ini/.htaccess/.user.ini

    Die Einstellungen _display_errors_ und _error_reporting_ wurden jetzt ausreichend behandelt. Aber um noch einmal zusammenzufassen, wann welche Option verwendet werden soll:

    • ini_set() und error_reporting() gelten nur für Laufzeitfehler.
    • php.ini sollte hauptsächlich für Entwicklungs-Setups bearbeitet werden. (Webserver- und CLI-Version haben oft unterschiedliche php.inis)
    • .htaccess Flags funktionieren nur bei veralteten Setups (Suche einen neuen Hoster! Gut verwaltete Server sind günstiger.)
    • .user.ini sind teilweise php.ini's für moderne Setups (FCGI/FPM)

    Und als grobe Alternative für Laufzeitfehler können Sie häufig verwenden:

    _set_error_handler("var_dump");   // ignores error_reporting and `@` suppression
    _
  2. error_get_last()

    Kann verwendet werden, um die letzte Laufzeitbenachrichtigung/Warnung/Fehler abzurufen, wenn error_display deaktiviert ist.

  3. $php_errormsg

    Ist eine überlokale Variable, die auch die letzte PHP Laufzeitnachricht enthält.

  4. isset() beginnen!

    Ich weiß, das wird vielen Leuten missfallen, aber isset und empty sollten nicht von Neulingen genutzt werden. Sie können die Benachrichtigungsunterdrückung hinzufügen, nachdem Sie überprüft haben, ob Ihr Code funktioniert. Aber noch nie zuvor.

    Viele der Fragen, die wir in letzter Zeit zum Thema "Etwas funktioniert nicht" erhalten, sind das Ergebnis von Tippfehlern wie:

    _if(isset($_POST['sumbit']))
    #                  ↑↑
    _

    Sie erhalten keine nützlichen Hinweise, wenn Ihr Code mit isset/empty/_array_keys_exists_ übersät ist. Manchmal ist es sinnvoller, ) =_@_ zu verwenden, sodass Hinweise und Warnungen zumindest in den Protokollen erscheinen.

  5. assert_options(ASSERT_ACTIVE|ASSERT_WARNING);

    So erhalten Sie Warnungen für assert()-Abschnitte. (Ziemlich ungewöhnlich, aber kompetenterer Code könnte einige enthalten.)

    PHP7 benötigt zend.assertions=1 auch in der php.ini.

  6. declare(strict_types=1);

    Durch das Biegen von PHP in eine streng typisierte Sprache werden nicht viele logische Fehler behoben, aber es ist definitiv eine Option für Debugging-Zwecke.

  7. PDO/MySQLi

    Und @Phil erwähnte bereits PDO/MySQLi error reporting Optionen. Ähnliche Optionen gibt es natürlich für andere Datenbank-APIs.

  8. json_last_error() + json_last_error_msg

    Für das JSON-Parsen.

  9. preg_last_error()

    Für Regexen.

  10. CURLOPT_VERBOSE

    Zum Debuggen von Curl-Anfragen benötigen Sie mindestens CURLOPT_VERBOSE.

  11. Shell/exec()

    Ebenso führt die Ausführung des Shell-Befehls nicht zu Fehlern. Du brauchst immer _2>&1_ und siehst dir das $ errno an.

1
mario

Neben all den wunderbaren Antworten hier möchte ich die MySQLi- und PDO-Bibliotheken besonders erwähnen.

Damit...

  1. Es werden immer datenbankbezogene Fehler angezeigt
  2. Vermeiden Sie es, die Rückgabetypen auf Methoden zu überprüfen, um festzustellen, ob ein Fehler aufgetreten ist

Die beste Option ist, die Bibliotheken auf Ausnahmen auslösen zu konfigurieren.

MySQLi

Fügen Sie dies am oberen Rand Ihres Skripts hinzu

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

Dies empfiehlt sich, bevor Sie new mysqli() oder mysqli_connect() verwenden.

GU

Setzen Sie das PDO::ATTR_ERRMODE -Attribut auf Ihrer Verbindungsinstanz auf PDO::ERRMODE_EXCEPTION. Sie können dies entweder im Konstruktor tun

$pdo = new PDO('driver:Host=localhost;...', 'username', 'password', [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);

oder nach der Schöpfung

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
1
Phil

Verwenden Sie Kint. Es ist eine Kombination von Debugging-Befehlen für Steroide. https://kint-php.github.io/kint/ Es ist sehr ähnlich zu Nette Tracy

0
siniradam

http://todell.com/debug kann auch nützlich sein. Sie können Ihre Objektwerte oder ausgelösten Debug-Fehler auch im Produktionsmodus im Hintergrund sehen.

0
PHPCoder

Das Aktivieren der Fehlerberichterstattung ist die richtige Lösung, scheint jedoch in dem Programm, mit dem sie aktiviert wird, keine Wirkung zu entfalten, sondern nur in später enthaltenen Programmen.

Daher erstelle ich immer eine Datei/ein Programm (das ich normalerweise "genwrap.php" nenne), das im Wesentlichen den gleichen Code wie die hier gängige Lösung hat (dh Fehlerberichterstattung einschalten) und dann auch die Seite enthält, die ich eigentlich möchte Anruf.

Es gibt zwei Schritte, um dieses Debugging zu implementieren.

One - Erstelle genwrap.php und füge diesen Code ein:

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

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

Two - ändere den Link zu dem Programm/der Seite, die du debuggen möchtest, um über genwrap.php zu gelangen,

ZB: ändern:

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

zu

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

Zusätzlich zu den vielen hervorragenden Antworten oben können Sie auch die folgenden zwei Funktionen in Ihren Projekten implementieren. Sie werden jeden Nicht-Syntax-Fehler abfangen, bevor die Anwendung/das Skript beendet wird. Innerhalb der Funktionen können Sie eine Rückverfolgung durchführen und eine angenehme Meldung "Site wird gewartet" für die Öffentlichkeit protokollieren oder rendern.

Schwerwiegende 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

0
Vladimir Ramik