PHP/Tutorials/Einstieg/Fehlerbehandlung

Aus SELFHTML-Wiki
< PHP‎ | Tutorials‎ | Einstieg
Wechseln zu: Navigation, Suche

Kann mein Webspace PHP?

Heutzutage ist PHP Standard bei allen Providern. Sie können dies einfach testen, indem Sie folgendes Programm auf ihren Server laden.

phpinfo.php
<?php
  phpinfo();
Folgt nach dem PHP-Programmcode kein auszugebender HTML-Code mehr, so kann das schließende ?> fehlen.

Falls PHP installiert ist, gibt Ihnen dieses kleine Programm sehr viele Informationen über ihre PHP-Installation und den Webserver aus, was recht nützlich ist. Merken Sie es sich also gut.

Screenshot der Ausgabe von phpinfo() in PHP 7.1

Wird eine weiße Seite angezeigt, überprüfen Sie …

  • die Dateiendung .php
  • ist der PHP-Code im Dokument valide?
  • ist PHP auf dem Server installiert?

Allerdings kann es sein (und ist nicht wirklich selten!), dass Webhoster in dem (fragwürdigen) Glauben, hierdurch die Sicherheit der Installation zu erhöhen, die Abarbeitung der Funktion phpinfo() verbieten. In dem Fall testen Sie mit:

phptest.php
<?php echo 'PHP? Funktioniert! Version ist: ', phpversion(), "\n";

Wird etwas wie: PHP? Funktioniert! Version ist: 7.1.0 ausgegeben, dann ist PHP ganz offensichtlich tätig geworden, also installiert und konfiguriert.

Testumgebung

Sie können PHP-Code z. B. in einer PHP Sandbox ausprobieren und testen.

Langfristig werden Sie aber nicht umhinkommen, einen Webserver lokal einzurichten (z. B. Apache).

Fehlerbehandlung

error-reporting

Wenn ein Skript nicht wie geplant läuft, können Sie sich Fehlermeldungen ausgeben lassen, um das Skript zu debuggen. Diese Einstellung treffen Sie entweder in der PHP.ini oder direkt im Skript:

Ausgabe von Fehlermeldungen
<?php
  ## Welche Fehler sollen angezeigt werden?
  error_reporting(E_ALL | E_STRICT);    
  ## Fehler nach dem Parsen des Scriptes, aber vor dem Scriptstart
  ini_set('display_startup_errors', 1); 
  ## Anzeige auf der Standardausgabe (Browser)
  ini_set('display_errors','1');         
?>

Allerdings findet diese Ausgabe direkt auf der Webseite und damit in der Öffentlichkeit statt. Angreifer können so Rückschlüsse auf das verwendete System und Lücken ziehen und diese ausnutzen.

Besser ist es daher, diese Einstellungen nur in der .htaccess des Test-Webservers oder in dessen php.ini oder Virt-Host Konfiguration vorzunehmen und auf dem Produktivserver die Ausgabe im Browser zu unterdrücken.

Einstellungen in der .htaccess
## PHP-Error-Einstellungen für den Testserver
php_value error_reporting 32767
php_flag display_errors 1
php_flag display_startup_errors 1

Siehe auch PHP php.ini Error-Reporting und PHP Vordefinierte Fehlerkonstanten

Damit die .htaccess ausgewertet wird, muss man dies zuerst in der Apache-Konfiguration /etc/apache2/apache2.conf erlauben.

Einstellungen in der /etc/apache2/apache2.conf
<Directory /var/www/>
    Options Indexes FollowSymLinks
#     AllowOverride None
    AllowOverride All
    Require all granted
</Directory>

Mit der obigen Einstellung php_value error_reporting 32767 in der .htaccess-Datei sollten auch Parse-Errors angezeigt werden. (Würde man nur den jeweils ersten Parse-Error sehen wollen, reichte hier auch die 4):

Ein einfaches `1 = 5;` in der Zeile 9 meines Testscriptes liefert die nachfolgende Fehlerausgabe:

Fehleranzeige in der Response
  Parse error: syntax error, unexpected '=' in /var/www/html/errors.php on line 9

Bleibt die Antwortseite im Browser trotzdem leer, wird vermutlich ein derartig schwerer Parse-Error aufgetreten sein, dass keine Ausgabe mehr möglich ist. Dann muss man in das eingestellte Error-Log schauen, also z. B. /var/log/apache2/error_log. Dort sollte der Fehler dann (einzeilig) kurz beschrieben sein. Im allerschlimmsten Extremfall muss der Webserver neu gestartet werden. Solche Fehler habe ich allerdings selber in 20 Jahren PHP erst zweimal geschafft :-)

Ausgabe von Variablen und ihren Werten

Manchmal will man wissen, welchen Inhalt eine (oder mehrere) bestimmte Variable(n) zu einer bestimmten Zeit hat/haben.

In diesem Artikel wird gezeigt, wie Sie die Ausgabe von var_dump() formatieren können:

Hauptartikel: PHP/Tutorials/Variablenkontrolle

Allerdings hat diese Methode einen großen Nachteil. Die Ausgabe der Variable und ihrer Werte erfolgt auf der Webseite selbst. Besser als eine Ausgabe im Browser ist das Schreiben der Daten in eine Textdatei:

Ausgabe von Variablen in einer Textdatei
function debug () {
  $arg_list = func_get_args();

  foreach ($arg_list as $v) {
    file_put_contents(__DIR__.'/debug.txt',(
      is_string($v)
      ? $v
      : print_r($v, true) 
      // true = no immediate output to browser
      ),
      FILE_APPEND
      );
    }
  }

  debug("_POST: ",$_POST,"\r\n_GET: ",$_GET,"\r\n---- und das war's\r\n");

Die Textdatei "debug.txt" befindet sich direkt "neben" dem PHP-Script, also im gleichen Verzeichnis, wofür die magische Konstante __DIR__ verantwortlich ist.

Ausgabe von Fehlermeldungen in eine Datei

Standardmäßig schreibt PHP Fehlermeldungen in die Standardausgabe, weshalb sie im Browser erscheinen. Wenn Sie dieses Verhalten ändern möchten, können Sie die INI-Einstellung error_log verwenden. Hier können Sie entweder den speziellen Wert syslog eintragen, woraufhin die Meldungen unter Linux im System Log (siehe man syslog(3)) erscheinen und unter Windows im Event Log (Ereignisanzeige). Alternativ können Sie auch den Namen einer Datei eintragen, in den PHP die Meldungen schreiben soll. Diese Datei muss an einem Ort liegen, wo der PHP Prozess, der Ihre Webseite betreibt, Schreibrechte hat.

Weblinks