Netbeans, Vagrant und remote PHP Debugging mit xdebug

Geschrieben von everflux am Februar 14th, 2015

Vielleicht hilft dieser Tipp dem einen oder anderen weiter, der gerne die Netbeans IDE zur PHP Entwicklung verwendet und auch Vagrant nutzt: Wenn man mit Vagrant arbeitet, so werden die lokalen Dateien in der virtuellen Maschine gemounted. Für Netbeans konfiguriert man daher „lokalen Webserver“ als Umgebung.
Die Konfiguration von xdebug sieht dann am einfachsten so aus:

[xdebug]
xdebug.remote_enable = 1
xdebug.remote_connect_back = 1
;xdebug.remote_autostart = 1
xdebug.remote_handler=dbgp

Hier wird xdebug angewiesen, sich zum Aufrufer zurück zu verbinden – die IP wird aus dem Request genommen. Das passt in der Regel, wenn man innerhalb von Vagrant nicht noch wilde Sachen (Proxy) macht.
Was leider nicht passt: Die Pfade. Netbeans weißt xdebug für Breakpoints an, welche Datei – inkl. Pfad – an welcher Stelle einen Breakpoint erhalten soll. Die Ordnerstruktur ist innerhalb der virtuellen Maschine höchstwahrscheinlich anders, als auf dem Host-System.
Hierzu gibt man innerhalb von Netbeans noch ein Pfad-Mapping an: Projekt Konfiguration, „Run Configuration“, „Advanced“.
Nun waehlt man aus, wo man innerhalb der Vagrant bzw. VirtualBox Umbebung den Projekt Ordner eingebunden hat. In meinem Beispiel ist das /var/www/localhost

Anschließend kann man den Netbeans Debugger verwenden.
Möchte man spezielle Requests, wie z.B. PUT, mittels curl aufrufen kann man dies auch ganz einfach machen, in dem man den Xdebug Trigger als Parameter anhängt:

curl -X PUT -d '{}' http://localhost:8080/rest/endpoint.php/duplicates\?XDEBUG_SESSION_START\=netbeans-xdebug

Ein Screenshot der Netbeans Konfiguration als Referenz:
path-mapping

PHP: Logging von SQL Queries / PDO Prepared Statements

Geschrieben von everflux am Januar 17th, 2015

Das Debugging von (legacy) PHP Anwendungen kann ganz schoen nervig sein. Da hilft auch der ganze Werkzeugkasten nicht, den man aus anderen Umgebungen gewohnt ist.

Percona Toolkit pt-query-digest auf tcpdump hat mal direkt Probleme bei der Auswertung.

Instrumentierung / AOP von PHP „Anwendungen“ – eher mau. Das einzige was einigermaßen tut, ist ‚runkit‘. Jedoch kann das nicht alles, was man gerne möchte. Insbesondere kann man sich damit nicht an die Konstruktoren von PHP internen Klassen (PDO) anhängen. Damit war der Plan vollständig ohne PHP Code Änderungen auszukommen erst mal dahin.

Aber erst mal die guten Nachrichten: Verwendet man runkit, kann man von mysql_query bzw. mysqli_query schonmal alles mitlesen.

PHP runkit ist schnell aus dem git repo (PECL ist veraltet) installiert:

cd /tmp
git clone git://github.com/zenovich/runkit.git
cd runkit
pecl install package.xml
echo 'extension=runkit.so' >> /etc/php5/fpm/conf.d/20-runkit.ini
echo 'runkit.internal_override = true' >> /etc/php5/fpm/conf.d/20-runkit.ini
echo 'opcache.enable = 0' >> /etc/php5/fpm/conf.d/20-runkit.ini
php5-fpm restart

Danach hängt man ein bisschen Magie in den PHP code und alle mysqli_query Aufrufe werden abgefangen:


if (function_exists("runkit_function_redefine"))
{

  //clean up from cached versions
  if (function_exists('__mysqli_query'))
  {
    runkit_function_remove('__mysqli_query');
  }

  $myqsliDelegate = 'file_put_contents("/tmp/queries.txt", $sql. ";\n", FILE_APPEND); return __mysqli_query($db, $sql);';

  runkit_function_rename('mysqli_query', '__mysqli_query');
  runkit_function_add('mysqli_query', '$db, $sql', $myqsliDelegate);
}

Jetzt kommt noch PDO, auch hier hätte man ja gerne die Prepared-Statements. Hier ist die Besonderheit dass erst die Datenbank die prepared sql statements mit Parametern belebt.
Dazu kann man sich dieser Klasse bedienen: https://github.com/noahheck/E_PDOStatement – die Interpolierung wird dann simuliert.
In meinen Fällen reichte das voll und ganz.
So sieht dann der runkit code für das Logging der PDO Statements mit der Hilfsklasse E_PDOStatement aus, die mir im Property fullQuery die interpolierte Query bereitstellt:



   $pdoDelegate = '$res = $this->__execute(); $query = $this->fullQuery; file_put_contents("/tmp/queries.txt", $query. "; --\n", FILE_APPEND); return $res;';
   runkit_method_rename("E_PDOStatement", "execute", '__execute');
   runkit_method_add("E_PDOStatement", "execute", '',  $pdoDelegate);


Leider muss jetzt noch an den Stellen, an denen das PDO instantiiert wird das E_PDOStatement konfiguriert werden. Normalerweise ist die Anzahl aber überschaubar. Damit nur auf Entwicklerrechnern das Logging aktiviert wird, habe ich noch einen environemnt Check dazu gepackt:


  if ((getenv("environment") === "LOCAL"))
  {
     require_once("lib/E_PDOStatement.php");
     $con->setAttribute(PDO::ATTR_STATEMENT_CLASS, array("E_PDOStatement", array($con)));
  }

Netbeans + git = merge commit bei pull?

Geschrieben von everflux am März 16th, 2013

Netbeans unterstützt derzeit keine interaktive Auswahl der Optionen „merge commit“ oder „rebase“ wenn bei einem git pull kein fast-forward möglich ist. Dazu gibt es diesen Netbeans bug: http://netbeans.org/bugzilla/show_bug.cgi?id=213855

Als kleiner Work-Around ist es jedoch mit git Bordmitteln möglich, das Default-Verhalten von git selbst anzupassen. Dazu kann man auf einem Branch das Verhalten konfigurieren, z.B. dem master branch:

git config branch.master.rebase true

Ich hoffe dieser kleine Netbeans Tipp hilft auch anderen Usern 🙂

Oracle veröffentlicht Netbeans 6.9

Geschrieben von everflux am Juni 16th, 2010

Netbeans ist nun in der Version 6.9 von Oracle freigegeben worden. Die Entwicklungsumgebung für Java, PHP, JavaScript, Groovy, Scala, … wird von Oracle zusammen mit der OpenSource Community entwickelt. Das nun veröffentlichte Netbeans 6.9 enthält viele Neuerungen. Für PHP Entwickler besonders interessant ist die Unterstützung des Zend Framework in der aktuellen Version. Weiterlesen »

PHP: gd-png: fatal libpng error: Read Error: truncated data

Geschrieben von everflux am Mai 17th, 2010

Gerade zum Bloggen von Webseiten-Screenshots bietet sich diese Firefox Extension an: Screengrab. Bisher hat das auch alles prima geklabbt: Ubuntu, Firefox, WordPress Blog und Ubuntu Server.

Neuerdings gibts da jedoch ein Problemchen: Beim Hochladen der Bilder ins WordPress gibt es nur das „broken Image“ Symbol, und auf dem Server wird ganz viel dieser Art geloggt:

gd-png:  fatal libpng error: Read Error: truncated data
gd-png error: setjmp returns error condition 2gd-png:  fatal libpng error: Read Error: truncated data
gd-png error: setjmp returns error condition 2gd-png:  fatal libpng error: Read Error: truncated data
gd-png error: setjmp returns error condition 2

Die defekten Zeilenvorschübe kommen dabei original so aus dem Logfile. Ich habe zwar nach der Fehlermeldung ein wenig gesucht, konnte jedoch lediglich einen Hinweis finden, dass es auf aktuelleren PHP Versionen (z.B. Ubuntu Lucid) evtl. zu Problemen mit der Kompressionsstufe 10 kommen kann. Weiterlesen »

Skipfish und Ubuntu

Geschrieben von everflux am März 21st, 2010

Google hat mit dem Skipfish Projekt ein Sicherheitstool veröffentlicht, mit dem Webanwendungen auf ihre Sicherheit – oder auch Sicherheitslücken untersucht werden können.

Das in C++ Programm unterstützt Windows, Apple Mac OS X und Ubuntu als Betriebssysteme und – wie für Google üblich – wird die besonderes hohe Performanz als Feature genannt. Im folgenden gehe ich kurz die Schritte durch, Skipfish unter Ubuntu Linux zu betreiben. Weiterlesen »

PDF Erstellung mit PHP und dem Zend Framework

Geschrieben von everflux am August 21st, 2009

Das Zend Framework bietet Komponenten für so ziemlich jede Aufgabe, die man als PHP Entwickler vorfinden kann. Doch einen Haken hat das Zend Framework – durch eine sehr individuelle Auslegung von „loose coupling“ steht man vor der Herausforderung die verschiedenen Komponenten zu integrieren. Nachdem ich von einem Freund gebeten wurde, mal ein Beispiel zu liefern, wie Zend_PDF verwendet werden kann, um mittels PHP und dem Zend Framework PDF Dateien auszugeben, findet sich nun hier ein entsprechendes Beispiel.

Als Vorlage PDF Datei wurde dabei mittels OpenOffice ein PDF erstellt, um zu demonstrieren, wie sich mittels Zend_PDF auch Vorlagen verwenden lassen. Dafür wurde bisher oft FPDF bzw. PDFi als PHP Bibliotheken verwendet. All diese PDF Funktionalität für PHP wird nun mittels der Zend_PDF Komponente abgebildet.

Weiterlesen »

Netbeans: Copy support failed. Continue?

Geschrieben von everflux am August 7th, 2009

Netbeans ist eine herausragende IDE – herausragend durch einfache Bedienbarkeit, gleichzeitig gibt es eine Fülle von Features für den gestressten Entwickler. Und der Preis: Kostenlos! Ob für Java oder PHP Entwicklung, ich möchte Netbeans nicht mehr missen. Besonders für PHP – haben mir die kleinen Tipps und Hinweise doch schon einiges an Nerven gespart. Nicht zu vergessen die erstaunlich gut funktionierende Code-Completion. (Hätte ich bei PHP nie für möglich gehalten.)

Doch es gibt eine Sache, die mich unter Ubuntu in den absoluten Wahnsinn getrieben hat: Ich habe zwei Ubuntu Rechner, einen Server und meinen Arbeitsplatz. Auf dem Server läuft Apache und Mysql – auf meiner Arbeitsstation möchte ich keinen Apache laufen lassen, so dass ich alle Dateien auf den Server lade. Weiterlesen »

Chromium Browser: Schneller Entwickeln!

Geschrieben von everflux am August 1st, 2009

Welche IDE man bevorzugt, darüber kann man sicherlich vortrefflich streiten. Genauso übrigens auch über Webbrowser. Doch eins ist klar: Bei der Entwicklung zählt jede gesparte Sekunde. Gerade in Webanwendungen wird man nicht um manuelles Testen und Ausprobieren herumkommen. Ich habe gemerkt, dass man mit dem Firefox (Firebug, Webdeveloper Toolbar, etc. pp) wunderbar Debugging betreiben kann. Das Tooling ist in meinen Augen ungeschlagen. Weiterlesen »

PHP FastCGI Path Bug (Ubuntu Hardy)

Geschrieben von everflux am Mai 4th, 2009

Ubuntu Hardy Heron ist derzeit das aktuelle LTS Release von Ubuntu, also ein gutes Argument Hardy für Server einzusetzen. Doch es gibt auch Gründe zu wechseln, wie mir sehr schmerzhaft vor Augen geführt wurde.

Zur Konstellation: PHP wird auf dem betreffenden Server mittels FastCGI Protokoll (fcgid) betrieben. Damit auch suexec zum Zuge kommt, wird der PHP Interpreter über ein kleines Wrapper-Script gestartet. Dies führt dazu, dass in der Umgebungsvariable SCRIPT_NAME nur der Wrapper steht – normalerweise. Dankenswerterweise wird das von PHP erkannt und irgendwie umgeschrieben, so dass hier der tatsächliche (erwartete) Wert steht. Ebenfalls sollte PATH_INFO nur noch den nach dem Script folgenden Anhang aufweisen, so dass man hier bei Bedarf Parameterübergabe (z.B. für „REST“) abwickeln kann.

Leider tut das mit PHP 5.2.4 (genauer: PHP 5.2.4-2ubuntu5.6 ) nicht wie erwartet. PATH_INFO ist leer, SCRIPT_NAME enthält bei bestimmten Bedingungen unsinnge Daten. Weiterlesen »


http://everflux.de/
Copyright © 2007, 2008 everflux. Alle Rechte vorbehalten. All rights reserved.