… 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…