0251 / 590 644 - 0
info@a-coding-project.de

PHP - Error Handling und Debugging

Welchen Webprogrammierer ist es nicht schon mal passiert: Im Browserfenster wird eine Fehlermeldung mit einem kryptischen Text angezeigt, die man nicht versteht. Wie soll man jetzt den Fehler finden? Besonders Anfänger oder Leute, die dem Englischen nicht so mächtig sind, haben damit zu kämpfen.

Fehlerkonfiguration in der php.ini

In der PHP-Konfigurationsdatei stehen eine Reihe von Parametern zur Verfügung, mit denen eingestellt werden kann, wie PHP allgemein mit Skriptfehlern umgehen soll.

Parameter error_reporting

Dieser Parameter legt fest, ob überhaupt Fehler angezeigt werden sollen oder nicht. Wenn Fehler anzeigt werden sollen, kann weiterhin festgelegt werden, welche Fehlertypen beachtet werden sollen.

Mögliche Werte:
Es können entweder Bit-Werte von 0 - 2048 oder die entsprechenden Text-Konstanten für die Fehlerkategorie angegeben werden.
Bei Bit-Werten können u.a. durch die Operatoren "|" oder "&" mehrere Kategorien gleichzeitig angegeben oder ausgeschlossen werden.

Die folgende Tabelle zeigt die möglichen Konstanten, deren Bedeutung und die dazugehörigen Bit-Werte:

Name der PHP-Konstanten Bit-Wert der Fehlerkategorie Bedeutung
E_ERROR 1 Schwere Laufzeitfehler; Fehler nicht behebbar, Abbruch der Skriptausführung
E_WARNING 2 Warnungen zur Skriptlaufzeit; keine fatalen Fehler; kein Skriptabbruch
E_PARSE 4 Parser-Fehler während der Übersetzung
E_NOTICE 8 Benachrichtigung auf mögliche Fehlerursache; auch bei ordnungsgemäßer Skriptausführung möglich
E_CORE_ERROR 16 Fatale Fehler beim Start von PHP
E_CORE_WARNING 32 Warnungen beim Starten von PHP
E_COMPILE_ERROR 64 Fatale Fehler während der Übersetzung des Skriptes
E_COMPILE_WARNING 128 Warnungen während der Übersetzung des Skriptes
E_USER_ERROR 256 Benutzerdefinierte Fehlermeldungen; werden mit Funktion "trigger_error" erzeugt
E_USER_WARNING 512 Benutzerdefinierte Warnungen; werden mit Funktion "trigger_error" erzeugt
E_USER_NOTICE 1024 Benutzerdefinierte Benachrichtigungen; werden mit Funktion "trigger_error" erzeugt
E_ALL 2047 Alle unterstützten Warnungen und Fehler, außer Kategorie E_STRICT
E_STRICT 2048 Benachrichtigungen des Laufzeitsystems
Zusätzlich gibt es noch den Bit-Wert 0, der besagt, dass überhaupt keine Fehlermeldungen generiert werden dürfen.

Parameter display_errors

Mit diesem Parameter wird festgelegt, ob Fehlermeldungen im Browserfenster angezeigt werden sollen oder nicht.

Mögliche Werte:
Ohne weitere Abstufungen können die Werte ON oder OFF angegeben werden.

Parameter display_startup_errors

Damit wird festgelegt, ob Fehlermeldungen während des Starts von PHP angezeigt werden sollen oder nicht.

Mögliche Werte:
Ohne weitere Abstufungen können die Werte ON oder OFF angegeben werden.

Hinweis: Sogar wenn der Parameter display_errors aktiv ist, werden keine Fehlermeldungen während des Starts von PHP angezeigt. Es wird deshalb empfohlen, diesen Parameter auf OFF zu lassen.

Parameter log_errors

Damit wird festgelegt, ob Fehlermeldungen in einer Datei gespeichert (= geloggt) werden sollen oder nicht.

Mögliche Werte:
Ohne weitere Abstufungen können die Werte ON oder OFF angegeben werden.

Hinweis: Bei Betriebssystemen wie Linux gibt es eine standardmäßig vorhandene Datei, auf die auch PHP zugreift, ob Fehlermeldungen zu speichern. Ist so eine Datei nicht vorhanden, kann bei dem Parameter error_log eine separate Datei angegeben werden.
Es wird weiterhin empfohlen, die Fehlermeldungen in der Datei zu speichern, anstatt sie im Browserfenster ausgeben zu lassen.

Parameter log_errors_max_length

Damit kann eine maximale Länge für eine Fehlermeldung in der Log-Datei angegeben werden.

Mögliche Werte:
Es sind Werte zwischen 0 und 1024 möglich. Der Wert "0" bedeutet, dass es kein Längenmaximum gibt und wenn der Wert größer als 0 ist, ist die dazugehörige Einheit automatisch Bytes.

Parameter ignore_repeated_errors

Damit werden wiederholt aufgetretene Fehler in einem Skript geloggt. Dieser Parameter bezieht sich aber nur auf Fehler, die im gleichen Skript in der selben Zeile auftreten.

Mögliche Werte:
Ohne weitere Abstufungen können die Werte ON oder OFF angegeben werden.

Parameter report_memleaks

Fehler, die durch ein Skript im Arbeitsspeicher hervorgerufen werden, werden durch diesen Parameter angezeigt.

Mögliche Werte:
Ohne weitere Abstufungen können die Werte ON oder OFF angegeben werden.

Parameter html_errors

Wenn dieser Parameter aktiv ist, werden Fehlermeldungen generiert, die mit der Maus anklickbar sind. So kann über einen Link im Internet oder auf dem Rechner eine genauere Beschreibung zum aufgetretenen Fehler aufgerufen werden.

Mögliche Werte:
Ohne weitere Abstufungen können die Werte ON oder OFF angegeben werden.

Parameter docref_root

Hier gibt man einen Pfad an, der aufgerufen wird, wenn es sich um eine Fehlermeldung handelt, die mit dem Parameter html_errors generiert wurde.

Mögliche Werte:
Der Pfad zu den Dateien mit den Beschreibungen der Fehlermeldungen

Hinweis: Bei der Pfadangabe kann es sich um einen lokalen Pfad oder um eine URL im Internet handeln.

Parameter docref_ext

Damit wird festgelegt, welche Endung die Dateien mit den Fehlerbeschreibungen haben kann.

Mögliche Werte:
Angabe der Dateiendung - z.B. ".html"

Hinweis: Die Wertangabe zu docref_ext muss mit einem Punkt beginnen.

Parameter error_prepend_string

Damit wird vor der eigentlichen Fehlermeldung der Text ausgegeben, der für diesen Parameter als Wert angegeben wurde.

Mögliche Werte:
Individuelle Textmeldung, die ausgegeben werden soll.

Parameter error_append_string

Damit wird nach der eigentlichen Fehlermeldung der Text ausgegeben, der für diesen Parameter als Wert angegeben wurde.

Mögliche Werte:
Individuelle Textmeldung, die ausgegeben werden soll.

Parameter warn_plus_overloading

Damit wird - wenn der Parameter aktiv ist - überprüft, ob innerhalb eines Strings ein "+"-Zeichen verwendet wird und in diesem Fall eine Meldung ausgegeben.

Mögliche Werte:
Ohne weitere Abstufungen können die Werte ON oder OFF angegeben werden.

Festlegung der Fehlerbehandlung innerhalb eines Skriptes

Verschiedene PHP-Funktionen bieten die Möglichkeit, die Konfigurationen in der php.ini zur Laufzeit des Skriptes zu verändern. Damit können trotz einer eigentlich festen Basis-Konfiguration die Einstellungen flexibel gehandhabt werden. Die folgende Liste zeigt ein paar dieser Funktionen und deren Anwendungsmöglichkeiten.

Funktion error_reporting()

Mit dieser Funktion gibt man an, welche Fehlerkategorie im Skript berücksichtigt werden soll.

error_reporting(0);
//Keine Fehler werden angezeigt

error_reporting(E_ALL ^ E_NOTICE);
//Alle Fehler außer der Kategorie E_NOTICE werden angezeigt

error_reporting(E_ALL);
//Alle möglichen Fehler werden angezeigt

error_reporting(E_ERROR | E_WARNING);
//Nur Fehler dieser Kategorien werden angezeigt

Funktion ini_set()

Mit der Funktion ini_set(), mit der auf einzelne Parameter in der php.ini zugegriffen werden kann, können diese auch geändert werden. Diese Funktion ist eine gleichwertige Alternative zu error_reporting().

Allgemein gibt man bei der Funktion zuerst in Anführungszeichen den Parameter aus der php.ini an und - durch Komma getrennt - den gewünschten Wert.

Beispiel:

ini_set("error_reporting",0);

Funktion trigger_error()

Damit können individuelle Fehlermeldungen für die E_USER-Kategorien definiert werden. Wenn keine Kategorie mit angegeben wird, geht die Funktion von E_USER_NOTICE aus. Beispiel:

<?
if(4 % 2 == 1) 

 trigger_error("Es liegt ein Fehler vor", E_USER_WARNING); 
}
?>

Funktion error_log

Mit dieser Funktion kann ebenfalls eine individuelle Fehlermeldung erzeugt werden, die aber dann an ein bestimmtes Ziel geschickt werden kann. Die folgenden Beispiele zeigen die möglichen Ziele und deren Anwendung. Innerhalb eines Skriptes können verschiedene Ziele angegeben werden.

error_log("Dies ist ein Fehler",0);
//Meldung wird ins Betriebssystem-interne Logsystem geschrieben 
//oder in Datei, die beim Parameter error_log angegeben wurde.

error_log("Dies ist ein Fehler",1,"info@html-world.de");
//Fehlermeldung wird an die angegebene Email-Adresse geschickt

error_log("Dies ist ein Fehler",2,"Hostname oder IP-Adresse");
//Fehlermeldung wird an den PHP-Debugger geschickt, der über 
//seinen Hostnamen oder seine IP-Adresse angesprochen wird.

error_log("Dies ist ein Fehler",3,"/pfad/zur/datei.log");
//Fehlermeldung wird an die angegebene Datei geschickt und dort 
//eingetragen

Debugging in einem PHP-Skript

Das Debugging (= Fehlersuche) in einem Skript wird zum einen ebenfalls durch verschiedene Funktionen ermöglicht.
Zuvor sollen aber noch die Bedeutung einiger Fehlermeldungen, die öfters auftauchen und ein paar praktische Tipps angesprochen werden.

Fatal error: Call to undefined function: meine_function()

PHP findet die angegebene Funktion nicht.

Mögliche Ursachen:
- Funktionsname passt in Funktionsdefinition und -aufruf nicht zusammen (Schreibfehler)
- Ist die notwendige PHP-Erweiterung in der php.ini freigeschaltet? (Systemfunktion von PHP)
- Unterstützt die genutzte PHP-Version die definierte Funktion? (Systemfunktion von PHP)

Notice: Undefined variable: wert

Es wird auf eine nicht vorhandene Variable mit der Bezeichnung wert zugegriffen.

Mögliche Ursachen:
- Schreibfehler bei der Deklaration der Variable
- Nicht-Anwendung von $_GET oder $_POST bei der Übertragung von Formulardaten

Hinweis: Eine Möglichkeit, diesen Fehler zu umgehen, ist die vorige Überprüfung, ob die Variable wirklich existiert. Erst wenn das der Fall ist, wird mit der Variable gearbeitet.

Parse error: parse error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING

Es wurde ein Sonderzeichen wie eine geschweifte Klammer, ein Semikolon oder Anführungszeichen vergessen.

Mögliche Ursachen:
- Schreibfehler im Skript
- "Betriebsblindheit"

Parse error: parse error, unexpected '='

Es taucht ein "=" an einer unerwarteten Stelle auf.

Mögliche Ursachen:
- Schreibfehler im Skript / Vergessen eines Sonderzeichens (Dollarzeichen, Anführungszeichen, geschweifte Klammern usw.)

Hinweis: Die gleiche Meldung kann auch bei anderen Zeichen wie "<", ">" oder "}" auftreten.

Warning: Cannot modify header information - headers already sent by (output started at ...)

Eine Information, die mit der Funktion header() definiert wurde, konnte nicht gesendet werden, da bereits vorher eine Ausgabe von Informationen im Skript erfolgte.

Mögliche Ursache:
Die header()-Definitionen wurden im Skript nicht gleich am Anfang angegeben.

Warning: fopen(...): failed to open stream: Permission denied

Der Zugriff auf die angegebene Datei ist nicht möglich.

Mögliche Ursachen:
- Zugriffsrechte für Datei sind für den angegebenen Zugriffsmodus nicht ausreichend.

Hinweis: Für die in diesem Zusammenhang verwendeten Funktionen wie fwrite, fclose usw. werden im Fehlerfall auch Warnmeldungen ausgegeben.

Warning: mail() expects at least 3 parameters, 2 given

Der mail()-Funktion wurden anstatt 3 Parameter nur 2 übergeben. Die mail()-Funktion benötigt zwingend mindestens 3 Parameter (Empfängeradresse, Betreff, Mailinhalt).

Debugging-Funktionen

Funktion var_dump

Mit dieser Funktion werden alle Informationen zu einer Variablen ausgegeben.

Beispiel:

<?php
$a = array(1, 2, array("a", "b", "c"));
var_dump($a);
?>

Ausgabe:

array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  array(3) {
    [0]=>
    string(1) "a"
    [1]=>
    string(1) "b"
    [2]=>
    string(1) "c"
  }
}

Funktion print_r

Damit kann an einer beliebigen Stelle im Skript der aktuelle Inhalt eines Arrays oder einer Variablen angezeigt werden. Beispiel:

<?
 $a = array ('a' => 'Apfel', 'b' => 'Banane', 
             'c' => array ('x', 'y', 'z'));
 print_r ($a);
?>

Ausgabe:

Array
(
    [a] => Apfel
    [b] => Banane
    [c] => Array
        (
            [0] => x
            [1] => y
            [2] => z
        )
)

Tipps zum Debugging

  • Das Anzeigen von Fehlermeldungen im Skript aktivieren. Dies realisiert man am besten über die Skriptzeile "error_reporting(E_ALL);"
  • Mit den Funktionen echo() oder print() sich immer Zwischenausgaben im Skript anzeigen lassen. So kann man kontrollieren, ob das Skript zu jedem Zeitpunkt die richtigen Werte generiert.
  • In den PHP-Fehlermeldungen wird immer eine Zeilennummer mit angegeben. In dieser Zeile muss aber nicht unbedingt der Fehler auftreten. Er kann auch schon vorher passiert sein, jedoch kann das Skript ab der betreffenden Zeile nicht mehr weiter ausgeführt werden. (Beispiel: Fehlen von geschweiften Klammern in if-else-Konstrukten)
  • Einbau von Kommentaren in das Skript, damit man jederzeit weiß, was in einem Skriptabschnitt abgearbeitet wird. Das ermöglicht es, schneller die Zusammenhänge zu erkennen.
  • Bei verschachtelten Konstruktionen im Skript immer mit Einrückungen (= TAB-Taste) arbeiten. Das fördert allgemein die Übersichtlichkeit und in Folge dessen auch die Fehlersuche.
  • Wenn die Möglichkeit besteht, kann mit einem Texteditor gearbeitet werden, der einzelne oder zusammenhängende Skriptbereiche farblich hervorhebt.