Fehler Management
AUS: http://www.php-dummies.de/script/Tutorials/Fortgeschritten/Error_Management/Fehler_Logbuch.html
Tutorials - Fortgeschritten - Error Management - Fehlermeldungen on - off
Tutorials - FortgeschrittenError Management: Fehlermeldungen on - off
Welche Fehler PHP anzeigt, kann man selbst bestimmen.
Dazu gibt es die Funktion error_reporting( what ).
Die Standard-PHP-Einstellung (in der php.ini vordefiniert) entspricht:Übersetzt: Reportiere alle Fehler, ausser E_NOTICE, also PHP-Anmerkungen.
Diese Anmerkungen sind eigentlich schon irgendwo gut gemeint, aber eben doch "lästig", denn sie merken alles an, was nicht 100% schön programmiert ist.
Also weg damit.Dieser Modus würde bewirken, dass gar keine Fehler mehr ausgegeben werden.
Bei schwerwiegenden Fehlern wird das Script dennoch abgebrochen.
Nur erhält der Besucher keine für ihn unnötige Fehlermeldung.
Das ist an sich gut. Aber nicht ganz - denn du erhältst auch keine Möglichkeit, zu sehen, was du da falsch programmiert hast.
Also sollte error_reporting(E_ALL ^ E_NOTICE) deine Wahl sein.
Was es alles für Fehlertypen für error_reporting( what ) gibt, die es einzeln ein- und auszuschalten gibt, steht auf der Manualseite auf php.net
Dazu gibt es die Funktion error_reporting( what ).
Die Standard-PHP-Einstellung (in der php.ini vordefiniert) entspricht:
<?php
error_reporting(E_ALL ^ E_NOTICE);
?>
error_reporting(E_ALL ^ E_NOTICE);
?>
Diese Anmerkungen sind eigentlich schon irgendwo gut gemeint, aber eben doch "lästig", denn sie merken alles an, was nicht 100% schön programmiert ist.
Also weg damit.
<?php
error_reporting(NULL);
?>
error_reporting(NULL);
?>
Bei schwerwiegenden Fehlern wird das Script dennoch abgebrochen.
Nur erhält der Besucher keine für ihn unnötige Fehlermeldung.
Das ist an sich gut. Aber nicht ganz - denn du erhältst auch keine Möglichkeit, zu sehen, was du da falsch programmiert hast.
Also sollte error_reporting(E_ALL ^ E_NOTICE) deine Wahl sein.
Was es alles für Fehlertypen für error_reporting( what ) gibt, die es einzeln ein- und auszuschalten gibt, steht auf der Manualseite auf php.net
error_reporting( NULL ) schaltet generell jede Form von Fehleranzeige aus.
Und nicht nur das, jegliche Fehlerbehandlung wird unmöglich gemacht.
Auch eventuellen mitloggen oder so...
Is doof.
Besser:Dies wäre die ideale Einstellung ab dem Zeitpunkt, ab dem die Page online steht.
Fehler werden nicht mehr angezeigt, aber du kannst trotzdem sehen, was für Fehler du gemacht hast:
Und dadefür bräuchtest am besten eine Datei, wo alles mitgeloggt wird.
Is sogar einfacher als gedacht:Diese Zeilen zusammen am Anfang deiner Scripte eingefügt - am besten in eine Datei "errorlog.php" schmeissen und includen - und die Sache läuft.
Ab sofort werden die Fehler in der Datei ".../errorlog.txt" gesammelt.
Die Datei muss nicht existieren, sie wird von allein angelegt.
Also insgesamt:
Wird aber kein Fehler angezeigt ;-)
Aber die Datei errorlog.txt hat nun folgenden Eintrag:
Schick. Und kein Besucher wird mit PHP-Gebrabbel genervt.
Apropos "schick"...
Ein paar Zeilen in der errorlog.php hinzugefügt und du bekommst die logdatei immer gleich zugemailt, wenn deine Page Script entdeckt, dass ein Fehler drinsteht:Kann erlaubt dir das überhaupt dein Server?
Das kannst du mit diesem kurzen Script testen:
Und nicht nur das, jegliche Fehlerbehandlung wird unmöglich gemacht.
Auch eventuellen mitloggen oder so...
Is doof.
Besser:
<?php
ini_set("display_errors", 0);
?>
ini_set("display_errors", 0);
?>
Fehler werden nicht mehr angezeigt, aber du kannst trotzdem sehen, was für Fehler du gemacht hast:
Und dadefür bräuchtest am besten eine Datei, wo alles mitgeloggt wird.
Is sogar einfacher als gedacht:
<?php
ini_set("log_errors", 1); /* Logging "an" schalten */
ini_set("error_log", $_SERVER['DOCUMENT_ROOT'] . "/errorlog.txt"); /* Log-Datei angeben */
?>
ini_set("log_errors", 1); /* Logging "an" schalten */
ini_set("error_log", $_SERVER['DOCUMENT_ROOT'] . "/errorlog.txt"); /* Log-Datei angeben */
?>
Ab sofort werden die Fehler in der Datei ".../errorlog.txt" gesammelt.
Die Datei muss nicht existieren, sie wird von allein angelegt.
Also insgesamt:
| benutzte Codefiles | errorlog.php |
<?php
include("errorlog.php");
echo "Wir erzeugen einen Fehler...";
dieseFunktionGibtsNicht("blah"); /* müsste eigentlich einen Fehler geben */
echo "Das Script läuft nicht bis hierher... wird durch den Fehler abgebrochen"; /* wird nicht mehr ausgegeben */
?>
include("errorlog.php");
echo "Wir erzeugen einen Fehler...";
dieseFunktionGibtsNicht("blah"); /* müsste eigentlich einen Fehler geben */
echo "Das Script läuft nicht bis hierher... wird durch den Fehler abgebrochen"; /* wird nicht mehr ausgegeben */
?>
Aber die Datei errorlog.txt hat nun folgenden Eintrag:
[29-Mar-2006 16:48:52] PHP Fatal error: Call to undefined function dieseFunktionGibtsNicht() in script.php on line 2
Schick. Und kein Besucher wird mit PHP-Gebrabbel genervt.
Apropos "schick"...
Ein paar Zeilen in der errorlog.php hinzugefügt und du bekommst die logdatei immer gleich zugemailt, wenn deine Page Script entdeckt, dass ein Fehler drinsteht:
<?php
$errorlogfile = $_SERVER['DOCUMENT_ROOT'] . "/errorlog.txt";
ini_set("display_errors", 0);
ini_set("log_errors", 1);
ini_set("error_log", $errorlogfile);
if(file_exists($errorlogfile)) {
$errors = file_get_contents($errorlogfile); /* Inhalt wird gelesen */
@unlink($errorlogfile); /* Datei wird gelöscht */
mail("meine@email.de", "ERROR-LOG $_SERVER[HTTP_HOST]", $errors); /* Mail wird gesendet */
}
?>
$errorlogfile = $_SERVER['DOCUMENT_ROOT'] . "/errorlog.txt";
ini_set("display_errors", 0);
ini_set("log_errors", 1);
ini_set("error_log", $errorlogfile);
if(file_exists($errorlogfile)) {
$errors = file_get_contents($errorlogfile); /* Inhalt wird gelesen */
@unlink($errorlogfile); /* Datei wird gelöscht */
mail("meine@email.de", "ERROR-LOG $_SERVER[HTTP_HOST]", $errors); /* Mail wird gesendet */
}
?>
Das kannst du mit diesem kurzen Script testen:
<?php
$ini = ini_get_all();
$check = array("display_errors", "log_errors", "error_log");
foreach($check as $iniset) {
$access = $ini[$iniset]['access'];
echo "<b>$iniset ändern:</b><br />\n";
if($access == 7) echo "ja, überall (per per ini_set(), php.ini, .htaccess oder httpd.conf)<br />\n";
elseif($access == 0) echo "nein, nicht änderbar<br />\n";
else {
if($access & 1) echo "ja, per ini_set()<br />\n";
if($access & 2) echo "ja, per php.ini, .htaccess oder httpd.conf<br />\n";
if($access & 4) echo "ja, per php.ini oder httpd.conf<br />\n";
}
echo "<br /><br />";
}
exit;
?>
$ini = ini_get_all();
$check = array("display_errors", "log_errors", "error_log");
foreach($check as $iniset) {
$access = $ini[$iniset]['access'];
echo "<b>$iniset ändern:</b><br />\n";
if($access == 7) echo "ja, überall (per per ini_set(), php.ini, .htaccess oder httpd.conf)<br />\n";
elseif($access == 0) echo "nein, nicht änderbar<br />\n";
else {
if($access & 1) echo "ja, per ini_set()<br />\n";
if($access & 2) echo "ja, per php.ini, .htaccess oder httpd.conf<br />\n";
if($access & 4) echo "ja, per php.ini oder httpd.conf<br />\n";
}
echo "<br /><br />";
}
exit;
?>