Remote PHP (Web + CLI) Debug mit Netbeans

24. Februar 2012 § Keine Kommentare

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 als Samba-User hinzugefügt wurde (sudo smbpasswd webuser) kann die Freigabe mit einem Rechtsklick als Netzlaufwerk (bei mir Z:) verbunden werden. Permanent und mit gespeichterten Zugangsdaten funktioniert bei mir (Win 7) leider nicht. Jetzt kann Netbeans auf die Dateien im Webroot bequem über den lokalen (Beispiel-)Pfad auf die Quelldateien zugreifen. Bei einer Magento-Installation dauert das erste Indizieren 5-10 Minuten, danach ist das Ganze aber erstaunlich flüssig zu benutzen.

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=<DEIN_HOSTNAME>
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.

Magento Testbestellungen löschen

19. August 2011 § Keine Kommentare

Nach der Installation und Konfiguration eines Magento Shops möchte man natürlich “jungfräulich” anfangen Bestellungen zu empfangen. Es gibt dafür inzwischen eine Extension, aber ich mache es lieber “per Hand” via SQL Query, getestet unter Magento 1.4.2.x. ACHTUNG: Dadurch werden sämtliche Katalogsuchvorgänge, Bestellungen, Tags, Wunschlisten und “Send to Friend” Einträge unwiderruflich gelöscht. Auf jeden Fall ein aktuelles Backup der Datenabank machen vor dem Ausführen!

-- Reset Magento TEST Data
SET FOREIGN_KEY_CHECKS=0;
-- reset dashboard search queries
TRUNCATE `catalogsearch_query`;
ALTER TABLE `catalogsearch_query` AUTO_INCREMENT=1;
-- reset sales order info
TRUNCATE `sales_flat_creditmemo`;
TRUNCATE `sales_flat_creditmemo_comment`;
TRUNCATE `sales_flat_creditmemo_grid`;
TRUNCATE `sales_flat_creditmemo_item`;
TRUNCATE `sales_flat_invoice`;
TRUNCATE `sales_flat_invoice_comment`;
TRUNCATE `sales_flat_invoice_grid`;
TRUNCATE `sales_flat_invoice_item`;
TRUNCATE `sales_flat_order`;
TRUNCATE `sales_flat_order_address`;
TRUNCATE `sales_flat_order_grid`;
TRUNCATE `sales_flat_order_item`;
TRUNCATE `sales_flat_order_payment`;
TRUNCATE `sales_flat_order_status_history`;
TRUNCATE `sales_flat_quote`;
TRUNCATE `sales_flat_quote_address`;
TRUNCATE `sales_flat_quote_address_item`;
TRUNCATE `sales_flat_quote_item`;
TRUNCATE `sales_flat_quote_item_option`;
TRUNCATE `sales_flat_quote_payment`;
TRUNCATE `sales_flat_quote_shipping_rate`;
TRUNCATE `sales_flat_shipment`;
TRUNCATE `sales_flat_shipment_comment`;
TRUNCATE `sales_flat_shipment_grid`;
TRUNCATE `sales_flat_shipment_item`;
TRUNCATE `sales_flat_shipment_track`;
TRUNCATE `sales_invoiced_aggregated`;
TRUNCATE `sales_invoiced_aggregated_order`;
TRUNCATE `sales_order_aggregated_created`;
TRUNCATE `sendfriend_log`;
TRUNCATE `tag`;
TRUNCATE `tag_relation`;
TRUNCATE `tag_summary`;
TRUNCATE `wishlist`;
TRUNCATE `log_quote`;
TRUNCATE `report_event`;
ALTER TABLE `sales_flat_creditmemo` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_creditmemo_comment` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_creditmemo_grid` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_creditmemo_item` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_invoice` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_invoice_comment` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_invoice_grid` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_invoice_item` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_order` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_order_address` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_order_grid` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_order_item` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_order_payment` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_order_status_history` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote_address` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote_address_item` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote_item` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote_item_option` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote_payment` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_quote_shipping_rate` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_shipment` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_shipment_comment` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_shipment_grid` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_shipment_item` AUTO_INCREMENT=1;
ALTER TABLE `sales_flat_shipment_track` AUTO_INCREMENT=1;
ALTER TABLE `sales_invoiced_aggregated` AUTO_INCREMENT=1;
ALTER TABLE `sales_invoiced_aggregated_order` AUTO_INCREMENT=1;
ALTER TABLE `sales_order_aggregated_created` AUTO_INCREMENT=1;
ALTER TABLE `sendfriend_log` AUTO_INCREMENT=1;
ALTER TABLE `tag` AUTO_INCREMENT=1;
ALTER TABLE `tag_relation` AUTO_INCREMENT=1;
ALTER TABLE `tag_summary` AUTO_INCREMENT=1;
ALTER TABLE `wishlist` AUTO_INCREMENT=1;
ALTER TABLE `log_quote` AUTO_INCREMENT=1;
ALTER TABLE `report_event` AUTO_INCREMENT=1;
SET FOREIGN_KEY_CHECKS=1;

Gefunden im Magento Forum

Magentos deutsche Bruttopreise auch in der Schweiz mit Schweizer Mehrwertsteuer verwenden

11. August 2011 § Keine Kommentare

Bei einem aktuellen Projekt gab es die Anforderung, die identischen Produkte mit gleichen Bruttopreisen wie für Deutschland eingestellt auch in der Schweiz zu verkaufen. Allerdings sollten hier natürlich die 8% für die Schweiz eingerechnet werden.

» Rest des Artikels lesen «

Magento erweitertes Exportprofil mit Herstellerfilter

30. Juni 2011 § Ein Kommentar

Über Magentos ‘Dataflow’ lässt sich eine Menge realisieren. Unter anderem natürlich der Im- und Export von Produktdaten um z.B. Preise zu pflegen. Leider sind die Standard-Filtermöglichkeiten nicht gerade berauschend. Will man z.B. alle Produkte eines Herstellers haben, so gibt es dazu bisher keine Möglichkeit. Ich zeige Ihnen hier wie das geht.

» Rest des Artikels lesen «

redmine / ChiliProject Mailabruf

13. April 2011 § Keine Kommentare

Heute wollte ich für meine Projektverwaltung ChiliProject den automatischen Mailabruf konfigurieren. Da ich die Ruby Enterprise Edition nutze um Kontrolle und Geschwindigkeit zu haben, fand der Cronjob leider die gems nicht… der Fehler war

Missing the i18n 0.4.2 gem. Please gem install -v=0.4.2 i18n

und die Lösung war die Angabe des expliziten Gem-Path im Cronjob-Eintrag:

*/5 * * * * WEBUSER cd /pfad/zur/chiliproject/installation/; rake -f Rakefile redmine:email:receive_imap GEM_PATH="/usr/local/lib/ruby/gems/1.8" RAILS_ENV="production" host=imap.domain.com username=mailnutzer password=mailpasswort

Ruby on Rails mit Eclipse als IDE einrichten

04. Mai 2006 § Ein Kommentar

Gerade drüber gestolpert. Eine detailierte Anleitung, wie man eine benutzbare Rails-IDE mit Eclipse realisiert.

NAPCS.COM – HOWTO – Setting up a Rails Development Environment on Windows Using Eclipse

Gruß vom eXanto-Team!