Vom: 15.11.2011

Code debuggen auf einem Remoteserver mit xdebug und Netbeans

Die Standardsituation als Softwareentwickler: das Programm verhält sich nicht so wie erwartet. Als Webentwickler hat man es da oft schwer und behilft sich mit Debugausgabe wie print "DEBUG: blah fasel"; Eine große Arbeitserleichterung stellt es dar, einen Debugger zu verwenden. Mit PHP und Netbeans ist das kein Problem. Solange der Server nicht mit der eigenen Entwicklungsmaschine identisch istgilt es, ein paar Hürden zu überwinden. Natürlich muss die xdebug-Erweiterung für PHP installiert sein. Die meisten Distributionen kennen xdebug von Haus aus, eine allgemeine Installation ist hier beschrieben. Für uns wichtig ist die remote-Funktion, die mit den richtigen Einstellungen aktiviert sein muss. Dies kann in der php.ini oder der .ini des Moduls geschehen, in den Einstellungen des Virtualhosts oder einer .htacces, sofern möglich. Hier beschrieben ist die .htaccess-Methode: php_value xdebug.remote_enable 1 php_value xdebug.remote_handler dbgp php_value xdebug.remote_mode req php_value xdebug.remote_host 127.0.0.1 php_value xdebug.remote_port 9000 php_value xdebug.idekey netbeans-xdebug Wie genau funktioniert das Debuggen dann? Der Server führt seine Scripten nach wie vor genauso aus, nimmt aber von sich aus Kontakt auf mit einem "Fernsteuer-Rechner", der Daten abgreifen und den Verlauf steuern kann. Hierbei ist die Situation Client/Server umgedreht: Wir nehmen im Browser Kontakt mit dem Server auf, dieser führt das PHP aus und gibt das Resultat zurück. Beim Debuggen nimmt zusätzlich der Server Kontakt auf mit dem Debugger, stellt hier also den Client dar. Wir müssen dem Server daher sagen, wo der Debugger erreichbar ist, dies geschieht mit den Zeilen

php_value xdebug.remote_host

und

php_value xdebug.remote_port.

Da wir mit der Entwicklungsmaschine meist "irgendwo" im Internet sitzen und jedesmal die neue IP in der .htaccess konfigurieren müssten, und  vermutlich auch noch hinter eine Firewall sind und Port-Forwarding eingerichtet werden müsste, behelfen wir uns hier mit einem Trick, der die ganze Sache sowohl sicher als auch bequem macht: mit einem SSH-Tunnel. Vorraussetzung ist natürlich Shellzugriff auf die Remote-Maschine, dann genügt folgendes Kommando auf dem lokalen Rechner: ssh -g -N -R9000:127.0.0.1:9000 [remote_host]   Hiermit richtet man seinen eigenen Tunnel von Port 9000 auf der Remote-Maschine auf Port 9000 der lokalen Maschine ein - der Server nimmt daher über den Umweg "SSH-Tunnel" direkt Kontakt auf mit der eigenen Entwicklungsumgebung. Nun muss nur noch die IDE (hier: Netbeans) richtig konfiguriert werden: Einstellungen in den OptionsEinstellungen in den Project Properties Ein Klick auf "Debug Project" und die IDE ruft den Browser auf und beginnt mit dem ersten Haltepunkt. Wie das Debuggen in Netbeans funktioniert ist hier ausführlich beschrieben.