In diesem Artikel möchte ich kurz zeigen, wie meine lokale Entwicklungsumgebung für PHP eingerichtet ist, und wie man entfernte (auf einer VM liegende) PHP-Skripte auch über das CLI in Netbeans debuggen kann.
Server (VM) einrichten
Unter Windows nutze ich eine virtuelle Maschine (via Virtualbox), auf der die Ubuntu Server Edition läuft. Dank VBoxHeadlessTray kann die VM bequem beim Bootvorgang mit gestartet werden und stört nicht weiter.
Auf dem Server läuft:
sudo apt-get install apache2 apache2-utils libapache2-mod-php5 mysql-server php5 php5-cli php5-common php5-curl php5-gd php5-imagick php5-mcrypt php5-mysql php5-xdebug phpmyadmin ntp samba samba-common screen vim subversion git
Samba konfigurieren
Samba ist zwar nicht optimal als Dateisystem, mit diesen Einstellungen (/etc/samba/smb.conf) und wenn die VM auf einer SSD-Platte liegt aber durchaus auf 40-60 MB/s und geringe Latenzzeiten zu bringen:
workgroup = HEIMNETZ
name resolve order = lmhosts host bcast
deadtime = 100
keepalive = 150
socket options = TCP_NODELAY,IPTOS_LOWDELAY,SO_KEEPALIVE,SO_SNDBUF=65536,SO_RCVBUF=65536
use sendfile = no
oplocks = no
level2 oplocks = no
log level = 0
debug level = 0
[Webroot]
comment = Apache
path = /var/www
valid users = www-data,webuser
force group = www-data
read only = No
create mask = 0644
locking = No
Nachdem
XDebug konfigurieren
Um xdebug benutzen zu können, muß dem Host-Rechner Zugriff gewährt werden. Dazu bearbeitet man mit dem Editor der Wahl die xdebug Konfiguration unter /etc/php5/conf.d/xdebug.ini:
xdebug.remote_enable=On
xdebug.default_enable=On
xdebug.remote_handler=dbgp
xdebug.remote_host=
xdebug.remote_port=9000
xdebug.idekey=netbeans-xdebug
Danach einmal den Apache neustarten, damit die Konfiguration eingelesen wird. Um das Debugging auf dem CLI zu starten habe ich einen Bashscript im Netz gefunden (leider habe ich die URL des originalen Autors nicht mehr):
#!/bin/bash
XDEBUG_CONFIG="idekey=netbeans-xdebug" php -dxdebug.remote_host=echo $SSH_CLIENT | cut -d "=" -f 2 | awk '{print $1}'
$1
Dieser Skript liegt bei mir unter /usr/local/bin/xdebug und braucht nach der Erstellung natürlich noch ein sudo chmod 755 /usr/local/bin/xdebug
um aufgerufen werden zu können.
Netbeans für Remote-Debug konfigurieren
In Netbeans muß unter Extras > Optionen > PHP > Debugging
der Port auf 9000 stehen, die Session ID "netbeans-xdebug" lauten und der Haken bei "Stop at first line" gesetzt sein. Alles andere ist bei mir deaktiviert.
Die eigentliche Konfiguration erfolgt in den Eigenschaften des Projekts. Mit einem Rechtsklick auf das Projekt im Reiter "Projekte" auf der linken Seite gelangt man zu den Eigenschaften des Projekts. Dort zur "Run Configuration" wechseln und einen neuen Eintrag erzeugen. Ich habe meinen "Manual/CLI" genannt. Hier muß nur "Run As" auf "Local Website" gestellt sein. Mit einem Klick auf "Advanced…" kommt man ins Untermenü. Dort bei "Debug URL" den Radiobutton auf "Do not open Webbrowser" setzen.
Am wichtigsten ist die Einstellung beim Path Mapping, da Netbeans sonst die zu debuggenden CLI-Skripte nicht anzeigen kann. Dort bei "Server Path" einfach "/var/www" eintragen und bei "Project Path" unser vorher gemapptes Laufwerk Z: auswählen.
Debugging starten
In Netbeans kann jetzt jederzeit eine Debugging-Sitzung gestartet werden (grüner Pfeil mit rotem Punkt in der Werkzeugleiste) und Netbeans wartet daraufhin auf eine xdebug-Verbindung. Via Putty kann man dann auf der VM einfach xdebug test.php
aufrufen, und Netbeans nimmt sofort die Verbindung auf und zeigt test.php
im Debugger. Die Datei "test.php" muß dafür irgendwo unter /var/www liegen, sonst weiß Netbeans nicht wo es suchen soll.
Natürlich kann man auch weiterhin bequem im Browser debuggen, z.B. mit der Easy XDebug Firefox Extension. Ich persönlich finde es sehr viel angenehmer die Debugging-Session manuell zu starten, da Netbeans bei mir für jeden Start und jedes Ende einer Session einen neuen Browsertab geöffnet hat.
Mit der hier vorgestellten Konfiguration lassen sich zusätzlich PHP-CLI Skripte debuggen, und man hat die volle Kontrolle darüber wann und wo eine Debug-Session starten soll.