Ulf Wendel

PHP: Win32 Build Tanz ohne gdancer

… das waren noch Zeiten als der gdancer alle 10 Minuten PHP Build Probleme unter Win32 reportet hat. In meinen dunklen Erinnerungen war er ein Nachfolger von Andreas Otto (der inzwischen wohl geheiratet hat *tratsch*) aus dem PHP4Win Zeiten. Und heute? Sebastian hat keinen Nachfolger benannt und php.net lässt seinen Source einfach so auf die armen Win32 Anhänger los. Die Windows Build Anweisungen für PHP 5(.1) mit Visual Studio 6 (MSVC++ 6) lassen zunächst ein gutes Gefühl aufkommen.

Erste Schritte beim Kompilieren von PHP 5 unter Windows

Neuerdings, naja neuerdings ist relativ – ich habe seit bestimmt drei Jahren kein PHP unter Windows kompiliert -, also neuerdings, sieht der Buildprozess so ähnlich aus wie unter Unix. Das ist eigentlich ganz angenehm: buildconf, configure, nmake. Und der Einstieg in die neue Welt fällt dank der Anweisungen im PHP Handbuch denkbar einfach.

An einer Stelle wird das Handbuch etwas ungenau: Build the libraries you are going to need (or download the binaries if available) and place the headers and libs in the C:\work\win32build\include and C:\work\win32build\lib directories, respectively. Die Eigenschaft von PHP als Sammlung von allen möglichen Bibliotheken zu dienen, ist ein Segen und ein Fluch zugleich. Ein Segen, weil die Funktionsvielfalt in PHP unendlich groß ist und ein Fluch, weil PHP-Entwickler nicht nur PHP selbst sondern auch die zugehörigen Bibliotheken beim Debugging untersuchen müssen. Man sollte dem Kompiler mitteilen wo die Bibliotheken, Include-Dateien und Hilfsprogramme abgelegt sind, die zur Kompilierung benötigt werden. Die entsprechenden Suchpfade lassen sich u.a. über Umgebungsvariablen konfigurieren.

Umgebungsvariablen setzen

Die php.net Anleitung schlägt vor, die Build-Umgebung in C:/work einzurichten. Bibliotheken, die von PHP-Extensions benötigt werden, sollen in C:/work/lib und Include-Dateien in C:/work/include abgelegt werden. Weitere Bibliotheken und Include-Dateien stammen aus dem win32build.zip und werden in C:/work/win32build/lib bzw. C:/work/win32build/include abgelegt.

All diese Verzeichnisse sind natürlich den Suchpfaden für den Kompiler hinzuzufügen. Der Suchpfad für Bibliotheken kann mit der Umgebungsvariable lib eingestellt werden. include kann benutzt werden, um den Suchpfad für Include-Dateien zu verändern.

Bei der Ergänzung der Suchpfade ist darauf zu achten, daß die Verzeichnisse C:/work/lib und C:/work/include vor den Verzeichnissen für die Inhalte aus dem win32build.zip eingefügt werden. Die win32build.zip Inhalte sind recht alt und es ist ratsam, die Konfiguration so vorzunehmen, dass sie nur dann vom Kompiler verwendet werden, wenn keine neueren Bibliotheken und Include-Dateien in C:/work/lib und C:/work/include abgelegt wurden.

Zur Erweiterung der Suchpfade wird der bestehende Wert für die jeweilige Umgebungsvariable um neue Pfadangaben ergänzt. Die neuen Pfadangaben werden am Ende des Wertes eingefügt und durch ein Semikolon abgetrennt, z.B. <alter_wert>;<ergaenzung> .

Vorsicht mit der alten libMySQL aus dem win32build.zip!

Schmerzen können alte Bibliotheken aus dem win32build.zip bereiten. Versucht man neuere Extensions mit den alten Bibliotheken zu kompilieren, kann es zu Fehlermeldungen wie “unresolved symbol” oder “Nichtaufgeloeste externes Symbol” kommen. Der Kompiler beklagt sich darüber, dass Definitionen im Quellcode verwendet werden, die noch nicht oder nicht mehr in der Bibliothek zu finden sind.

Das win32build.zip enthält an drei Stellen alten Code, den man nicht verwenden will: C:/work/win32build/lib, C:/work/win32build/lib/dlls, C:/work/win32build/include. Das Verzeichnis C:/work/win32build/lib/dlls wird verwendet, wenn man eine Extension nicht direkt in PHP einkompiliert sondern eine ladbare *.dll erzeugt. In den lib Verzeichnissen findet sich eine alte libmySQL aus dem Jahre 1998, also aus dem letzten Jahrtausend. Bitte nicht mehr verwenden, es sei denn man versucht ein MySQL aus dem Baujahr 1998 anzusprechen! Die alten Include-Dateien mit den Namen mysql* lagern in C:/work/win32build/include. Auch sie haben das Mindeshaltbarkeitsdatum überschritten. Vor dem Genuss wird ausdrücklich gewarnt.

Wer PHP und MySQL (natürlich spreche ich nur noch von den 5+ Versionen…) miteinander kombiniert sollte immer versuchen, die MySQL Client Library mit PHP zu verwenden, die zum jeweiligen MySQL Server gehört. Anders gesagt: MySQL Client Library Version und MySQL Version sollten idealerweise identisch sein. Rückwärtskompatibilität sollte bestehen, wenn eine neue MySQL Client Library mit einem älteren MySQL verwendet wird. Dennoch: optimal sind identische Versionen.

--with-mysqli mit der alten libmySQL aus dem win32build.zip kombinieren zu wollen ist ein recht hoffnungsloser Versuch. Also schleunigst neue, passende MySQL Blibliotheken und Include-Dateien in C:/work/lib und C:/work/include ablegen. Sonst tut es unnötig weh. Wenn es dann immer noch nicht klappt, sollte man die alten Versionen löschen und so die Verwendung der neuen Versionen erzwingen.

Dunkle Erinnerungen

Nach so langer Zeit gab es noch einen Stolperstein für mich: wo ist --with-apxs2? Mal sehen was --enable-apache2handler macht. Und wie baut man die mysqli-Extension als *.dll? --with-mysqli=shared. Naja, wenigstens das =shared kommt mir noch irgendwie bekannt vor.

Jeder (Wieder-)Anfang ist schwer. Aber was dieses iconv von mir will, hmm…

Comments are closed.