code-phage-bug

Debugging mit PHP

Von am 05.12.2016

Da viele nur die klassische Methode mit echo, print_r oder var_dump kennen, möchte ich in diesem Blogpost ein paar weitere Möglichkeiten aufzeigen, wie in PHP effektiv gedebugged werden kann.

Die erste bereits angesprochene Methode sollte jeder kennen, der schon mal mit PHP programmiert hat. An gewünschten Zeilen im Code werden einfach die Variablen zur Kontrolle, ob der Inhalt auch der ist der erwartet wird, ausgegeben. Der Unterschied zwischen den 3 Ausgabemöglichkeiten ist folgender:

  • echo $variable.“test“; – Ausgabe einer Variable als String; Arrays können hiermit nicht auf ihren Inhalt überprüft werden
  • print_r($array); – Ausgabe einer Variable in lesbarer Form; hiermit können auch Arrays oder Objekte lesbar ausgegeben werden
  • var_dump($objekt); – gibt eine Variable mit all ihren Informationen aus ( inkl. Datenformat etc.)

Diese Methode erlaubt es nicht, den Prozess an bestimmten Stellen mittels Breakpoint zu pausieren um Variablen zu untersuchen. Fehlermeldungen von PHP können mittels der error_reporting Funktion angezeigt werden. Der Funktionsparameter gibt das Level der auszugebenden Fehlermeldungen an (genauere Infos auf php.net). So kann die Art des zugrundeliegenden Fehlers eingegrenzt werden. Diese Methode hat den Nachteil, dass Ausgaben wenn sie nicht auf zB die IP Adresse gesperrt sind (mittels $_SERVER['REMOTE_ADDR'] bzw. bei der Verwendung von Proxys $_SERVER['HTTP_X_FORWARDED_FOR'] ) immer für den User sichtbar im Browser mit ausgegeben werden. Hier kann eine kleine Funktion abhilf schaffen, welche implementiert und jedesmal statt einem Ausgabebefehl aufgerufen werden kann.

function debug_to_console( $data ) {
      $output = '';
      if ( is_array( $data ) ) {
          $output .= "<script>console.warn( 'Debug Objects with Array.' ); console.log( '" . implode( ',', $data) . "' );</script>";
      } else if ( is_object( $data ) ) {
          $data = var_export( $data, TRUE );
          $data = explode( "\n", $data );
          
foreach( $data as $line ) {
              if ( trim( $line ) ) {
                  $line    = addslashes( $line );
                  $output .= "console.log( '{$line}' );";
              }
          }
                        
$output = "<script>console.warn( 'Debug Objects with Object.' ); $output</script>";
       } else {
           $output .= "<script>console.log( 'Debug Objects: {$data}' );</script>";
       }
    echo $output;
}

Diese Funktion gibt den Inhalt der Variablen nicht im Browserfenster aus, sondern schreibt alles in die Debug Konsole, auf die man zB mit dem sehr bekannten Add-on Firebug zugreifen kann. Sie kann sowohl Strings, als auch Array und Objekte verarbeiten.

Seit PHP 5.6 gibt es ein in PHP integriertes Debuggingwerkzeug für die Command Line, das phpdbg Modul. Dieses muss am Server zur existierenden PHP installation kompiliert werden. Des Weiteren muss SAPI aktiviert werden. Features des Moduls sind unter anderem Step-by-Step Debugging und das setzten von Breakpoints im Code.

Eine weitere Methode um PHP vernünftigt debuggen zu können is Xdebug. Diese Extension lässt sich über die PECL am Server installieren. Mittels einer IDE wie eclipse und den PDT (PHP Development Tools), PHPStorm oder NetBeans in der die Extension als Debugger eingerichtet ist, kann Xdebug zum Step-by-Step debuggen und Breakpoints setzen verwendet werden. (zB Tutorial für eclipse oder PHPStorm) Für Xdebug gibt es auch einige Browserplugins als unterstützendes Tool.

Eine weitere PECL Extension ist apd (Advances PHP Debugger). Diese Extension ist auf php.net gut dokumentiert und erlaubt ebenfalls das setzen von Breakpoints, das ausgeben von Fehlern und noch einige weitere Funktionen.

1 Kommentar

  • Iosif Miclaus am 05.12.2016 um 13:28

    Xdebug for the win !

    Um es zu aktivieren muss man einfach die aktive php.ini Datei (meistens am Ende der Konfigurationsdatei) ändern, um dies in etwa dergleichen zu reflektieren:

    [xdebug]
    zend_extension=“/Applications/MAMP/bin/php/php5.6.25/lib/php/extensions/no-debug-non-zts-20131226/xdebug.so“
    xdebug.remote_autostart=1
    xdebug.remote_enable=1
    xdebug.remote_host=localhost
    xdebug.remote_port=9000
    xdebug.remote_handler=dbgp

The comments are closed.