PHP-Fehler

Management von Problemfällen

Wie jede andere Programmiersprache zeigt auch PHP Fehler bei der Interpretation ihrer Programme an. Wenn ein Fehler auftritt, erhalten sie eine Meldung. In schweren Fällen wird das Programm abgebrochen.
Hier finden sie einige Tipps zum Umgang mit Fehlern.
PHP Hypertext Processor PHP PHP Hypertext Processor
Strategie Generelle Planung der Fehler-behandlung
Konfiguration Die Einstellungen der Konfigurationsdatei php.ini steuern die Fehlerbehandlung
@ Dieses Zeichen versteckt (harmlose) Fehler
$php_errormsg Diese Variable speichert Fehlermeldungen
ErrorHandler Ein eigenes Programm ersetzt den Standard-ErrorHandler von PHP
Sonstige Einige für das Debuggen nützliche Funktionen
Module Information über geladene Module und deren Funktionen
Syntax-Check Test eines PHP-Scripts mit PHP

Fehler-Strategie

Grund-Einstellung und Varianten

Das Verhalten von PHP beim Auftreten von Fehlern lässt sich sehr flexibel gestalten.

Man sollte Start-Fehler und Laufzeit-Fehler unterscheiden.
Die Fehlerquelle kann in der PHP-Konfiguration liegen, bei eigenen PHP-Programmen oder bei Server-Programm-Paketen.
PHP unterscheidet schwerwiegende (letale) Fehler, korrigierbare fehler, Warnungen und Notizen.

Die Absätze dieses Kapitels geben einige Tipps zur optimalen Gestaltung des Verhaltens von PHP beim Auftreten von Fehlern.

Versuchen Sie, für jeden Fall die passende Strategie zu entwickeln.

Start-Fehler

Wenn die PHP Konfiguration Fehler enthält oder deren Anweisungen nicht ausführbar sind, dann treten bereits beim Start von PHP Fehler auf.

Derartige Fehler sind nicht unbedingt letal, d.h. PHP kann danach mit Einschränkungen funktionieren. Sie können sich jedoch sehr unangenehm auswirken.
Startup-Fehler sollten immer angezeigt werden. In der PHP-Konfiguration setzt man
display_startup_errors = On

Ähnlich katastrophal sind Memory-Leaks:
report_memleaks = On
Derartige Fehler können nur am eigenen Server auftreten und sollten unbedingt vor jeder weiteren Arbeit behoben werden.

Laufzeit-Fehler

sind Fehler in einzelnen PHP Script-Programmen.
In eigenen Programmen sollten derartige Fehler immer angezeigt und behoben werden.
In der PHP-Konfiguration setzt man
display_errors = On
In diesem Fall sollten sie diese PHP Konfigurations Variablen so einstellen, dass die Fehler auffällig angezeigt werden, z.B.
error_prepend_string = "<div style='background-color:#FF0'>"
error_append_string = "</div>"

Die Variable error_reporting der PHP-Konfiguration bestimmt, welche Fehler angezeigt bzw. unterdrückt werden.
Für eigene PHP Programme setzt man am besten
error_reporting = E_ALL | E_STRICT | E_NOTICE
Diese Einstellung reagiert besonders streng. Wenn sie alle damit angezeigten Fehler beheben, dann sind ihre Programme absolut sauber und sollten auf jedem Standard-Server problemlos laufen.

Fehler in Schleifen

Wenn ein Fehler in einer Schleife (for..., while...) auftritt, dann könnte er theoretisch bei jedem einzelnen Durchlauf der Schleife angezeigt werden. Das kann tausende von Fehler-Meldungen ergeben.

Um diesen Unsinn zu vehindern, setzt man in der PHP-Konfiguration
ignore_repeated_errors = Off
ignore_repeated_source = Off
In diesem Fall werden auch Fehler in Schleifen nur einmal angezeigt.

Eigene PHP-Programme

An eigene PHP Script-Programme sollte man sehr strenge Maßstäbe anlegen. Selbst scheinbar harmlose Fehler (E_NOTICE) geben oft Hinweise auf unsaubere Programmierung oder sogar auf logische Fehler.

Am Test-Server für eigene PHP-Programme sollte jeder noch so harmlose Fehler angezeigt (und behoben) werden, z.B. mit
display_errors = On
error_reporting = E_ALL | E_STRICT | E_NOTICE

Server-Programm-Pakete

Größere Pakete enthalten einige 100..1000 Script-Programme, leider oft mit Fehlern. Wegen der Komplexität ist es kaum möglich, diese Fehler zu beseitigen. Das macht schon deshalb keinen Sinn, weil die Fehler oft auch in nachfolgenden Versionen enthalten sind.
Fehlerfreie Programm-Pakete wie → phpMyAdmin, MediaWiki oder WordPress sind leider eine seltene Ausnahme.

Fehler-Meldungen müssen bei Programm-Paketen unterdrückt werden, da sie immer stören, manchmal sogar das Programm lahmlegen.
Für diese Anwendung wird PHP so konfiguriert:
display_errors = Off

Daraus ergibt sich die Notwendigkeit, am eigenen Test-Server mindestens 2 verschiedene PHP-Konfigurationen zu installieren: Eine strenge für eigene PHP-Programme und eine nachsichtige für Programm-Pakete.

PHPRC

Kommerzielle Web-Provider richten am Apache Webserver meist die Umgebungs-Variable PHPRC ein: (Der folgende Text ist das Muster einer → Apache Konfiguration):
<IfModule mod_env.c>
SetEnv PHPRC /home/test/php_rc
<IfModule>
Die Variable PHPRC bezeichnet den Pfad zu einem Verzeichnis, in dem eine PHP Konfigurations-Datei php.ini erwartet wird.

Diese Technik wird von Web-Providern verwendet. PHPRC verweist auf ein für den Kunden zugängliches Verzeichnis. Damit kann jeder Kunde seine PHP-Konfiguration individuell einstellen.

Wenn im Verzeichnis PHPRC keine Konfigurations-Datei enthalten ist, dann wird diese Anweisung ignoriert.
Wenn sich darin eine Datei php.ini befindet, dann wird damit die PHP-Konfiguration für das betreffende User-Web (inkl. aller Unter-Verzeichnisse) gesteuert.

Der Webserver wird so konfiguriert, das jeder Kunde einen eigenen → virtuellen Webserver erhält. Für jeden dieser virtuellen Server wird die Variable PHPRC individuell festgelegt.

Apache-Modul   php5

Auf fast allen modernen Apache Webservern wird das Modul php5 geladen, welches einen schnellen PHP Interpreter zur Verfügung stellt.
Dieses Modul akzeptiert u.a. folgende Anweisung:
<IfModule mod_php5.c>
php_value display_errors off
<IfModule>
Mit Hilfe der Anweisungen php_value, php_flag, php_admin_value, php_admin_flag kann man jede Variable der PHP-Konfiguration in der Apache-Konfiguration ändern.

Dies ist auf einem eigenen Webserver die beste Technik zur Konfiguration des PHP Fehler-Verhaltens.

Diese Technik wird dann sinnvoll angewendet, wenn man mehrere → virtuelle Webserver betreibt. In diesem Fall gelten die Einstellungen der PHP Konfigurations-Datei php.ini grundsätzlich für alle Webserver.
Mit der vorgestellten Technik kann man einzelne PHP-Variable für jeden virtuellen Server abweichend einstellen.

Beispiel
In der PHP Konfiguration wird eine strenge Fehler-Meldung eingestellt. Das ist für eigene Entwicklungen sinnvoll.
Zusätzlich wird ein virtueller Webserver definiert, auf welchem Web-Programm-Pakete laufen. In dessen Konfiguration wird die Ausgabe von Fehler-Meldungen abgeschaltet.

Einzelne Script-Programme

Unabhängig von allen anderen Methoden ist es möglich, das Fehler-Verhalten für jedes einzelnen PHP Script-Programm individuell einzustellen.
Dazu setzt man z.B. diese PHP-Anweisungen an den Anfang des Quelltextes:
ini_set('display_errors','off');

Die geänderte Konfiguration gilt bis zum Ende des jeweiligen PHP Script-Programms.

Diese Variante bietet die größte Flexibilität. Sie erlaubt die individuelle Einstellung fast aller PHP Konfigurations-Variablen.

Die PHP-Anweisungen müssen allerdings in jedem einzelnen Script-Programm enthalten sein. Die Methode eignet sich daher bestenfalls für einzelne Programme, nicht jedoch für Script-Programm-Pakete von 1000en Dateien.

Das @-Zeichen unterdrückt Fehler

Im Beispiel rechts wird die Funktion mysql_connect verwendet, um einen Fehler zu provozieren: Es existiert weder der angegebene Server, noch der User oder das Passwort. Sehen sie rechts die Live-Live PHP-Fehlermeldungen.

Hinweis: Je nach Einstellung der → PHP-Konfiguration werden unterschiedliche - allenfalls keine - Fehlermeldungen abgegeben.
mysql_connect("noserver","nouser","nopswd");

Warning: mysql_connect() [function.mysql-connect]: Unknown MySQL server host 'noserver' (1) in /home/topsoft.at/www.topsoft.at/pstrainer/entwicklung/php/error/error.php on line 420
Wenn man das Zeichen @ vor eine PHP-Funktion setzt, dann wird die Ausgabe einer allfälligen Fehlermeldung unterbunden.
Überprüfen sie in diesem Fall immer das Resultat: (nur) so erfahren sie, ob die Funktion korrekt ausgeführt werden konnte.
$db = @mysql_connect($server,$user,$pswd);
if($db) {print "connect ok";}
else {print "no connect";}

Die Variable   $php_errormsg

Die Variable $php_errormsg speichert die jeweils letzte PHP-Fehlermeldung.
Allerdings ist das an die Einstellung der → Konfigurationsdatei gebunden: Rechts die Live-Live-PHP-Einstellung dieser Variablen.
  track_errors =

track_errors ist abgeschaltet
Wenn track_errors eingeschaltet ist, dann können sie die Variable $php_errormsg verwenden, um allfällige Fehler abzufragen: Beispiel:
$db = @mysql_connect($server ,$user,$pswd);
$em = $php_errormsg;
print "Fehler = $php_errormsg <br />";
Im Beispiel rechts wird ein Fehler provoziert. Falls track_errors aktiviert ist, dann wird die Fehlermeldung abgefangen und angezeigt.
Warning: mysql_connect() [function.mysql-connect]: Unknown MySQL server host 'noserver' (1) in /home/topsoft.at/www.topsoft.at/pstrainer/entwicklung/php/error/error.php on line 504

track_errors ist abgeschaltet.

Sonstige hilfreiche Funktionen

Server-Type
Server-CPU
Betriebssystem
Software
$_ENV['HOSTTYPE'] =
$_ENV['CPU'] =
getenv('MACHTYPE') =
PHP_OS = Linux
$_SERVER['SERVER_SOFTWARE'] = Apache/2
Apache Version PHP-Modul apache ist nicht verfügbar
Funktion apache_get_version() = [nicht verfügbar]
MySQL-Server
Client Version
Host
Protokoll
mysql_get_server_info() = 5.1.61-0+squeeze1
mysql_get_client_info() = 5.1.61
mysql_get_host_info() = Localhost via UNIX socket
mysql_get_proto_info() = 10
PHP-Version
Konfigurationsdatei
phpversion() = 5.3.3-7+squeeze9   oder   PHP_VERSION = 5.3.3-7+squeeze9
get_cfg_var('cfg_file_path') = /etc/php5/apache2/php.ini
Dateipfad
Dateiname
Dateiname (base)
Aktuelles Verzeichnis
__FILE__ = /srv/www/htdocs/entwicklung/php/error/error.php
basename(__FILE__) = error.php
dirname(__FILE__) = /srv/www/htdocs/entwicklung/php/error
getcwd() = /srv/www/htdocs/entwicklung/php/error
Quelltext-Zeile
(nächste)
__LINE__ = 659
__LINE__ = 660

PHP-Syntax-Check mit PHP-Funktion   php_check_syntax()

Ab Version 5 bietet PHP eine eigene Funktion zur Überprüfung der Syntax ('Grammatik') von PHP-Scripts.
$errmsg = "" ;
$testfile = "test.php" ;
$ok = php_check_syntax($testfile,$errmsg);
if($ok) {
print "Fehler in $testfile: <br />";
print $errmsg;
}
else {
print "Keine Fehler in $testfile <br />";
}
Letzte Änderung dieser Seite: 2011-11-30 13:04:28