Neulich wollte ich meinem Entwicklungsserver neu aufsetzen und in diesem Zuge gleich noch auf PHP 5.3 upgraden. Nach dem Upgrade traten aber einige Probleme auf, die auf den ersten Blick nicht so leicht zu identifizieren waren. Nach einer mehr oder minder langen Wartezeit wurde mir nämlich nur eine weiße Seite angezeigt. Nachdem ich dann die Fehlerausgabe (display_errors) eingeschaltet hatte, konnte ich feststellen, dass eine PHP-Warnung ausgegeben wurde:
Warning: mysql_connect() [function.mysql-connect]: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond. in ...
Fatal error: Maximum execution time of 60 seconds exceeded in ...
Also war der Fehler bei MySQL zu suchen. Testweise entfernte ich also die Instanz der MySQL-Klasse und siehe da, die Seite wurde angezeigt, allerdings mit anderen Fehlern und ohne die Inhalte aus der Datenbank – logisch.
Nun musste ich der Ursache auf den Grund gehen und fand schließlich auch eine Lösung für das Problem. MySQL bietet in den aktuellen Versionen keine Unterstützung für IPv6, der PHP-MySQL-Treiber hingegen schon. Dadurch versucht dieser eine Verbindung zum MySQL-Server über IPv6 aufzubauen, worauf der Server aber nicht antworten kann, was dann zu einem Timeout führt.
Die Lösung ist nun, bei den Verbindungseinstellungen im PHP-Skript eine IP-Adresse (bspw. 127.0.0.1) anstatt eines Hostnamen (bspw. localhost) zu benutzen. Eine andere Lösung wäre die IPv6-Unterstützung im Betriebssystem zu deaktivieren, was bei mir allerdings nicht viel gebracht hat.
Im übrigen sind Verbindungsversuche bei Angabe einer IP-Adresse anstatt eines Hostnamens deutlich schneller (siehe verlinkter Artikel).
Merke: Bis zur endgültigen IPv6-Unterstützung in MySQL lieber eine IP-Adresse für Serververbindungen benutzen.
Im vorigen Eintrag habe ich von Windows Vista „geschwärmt“ und welche Vorteile es hat. Alles ganz gut und schön bis zu dem Zeitpunkt, an dem ich die Entwicklungsumgebung mit Apache, PHP und MySQL (WAMP) installieren wollte. MySQL weigerte sich partout mit PHP zusammen zu arbeiten, obwohl der MySQL-Server zweifelsfrei im Hintergrund lief und auch über die Kommandozeile ansprechbar war.
Im Netz der Netze gibt es zahlreiche Lösungsvorschläge: Von libmysql.dll nach SysWOW64 anstatt System32 zu kopieren bis zu der Benutzung von libmysql.dll aus dem PHP-Package anstatt der aus dem MySQL-Package. Doch keiner der Vorschläge konnte das Problem beseitigen.
Also entschloss ich mich kurzerhand mit VirtualBox einen virtuellen Server auf der Basis von Windows 2000 Professional (über MSDNAA) aufzuziehen. Windows 2000 deshalb, weil es den Komfort von Windows XP besitzt aber nur rund halb so ressourcenhungrig ist.
Die Installation funktionierte einwandfrei. Dennoch scheint es zur Zeit (und nicht nur bei mir) wieder einige Probleme mit der im MySQL-Package mitgelieferten libmysql.dll zu geben. Letztendlich half es, die libmysql.dll aus dem PHP-Package zu nehmen und die Sache lief.
Ein wenig rumprobieren musste ich allerdings bei den Netzwerkeinstellungen von VirtualBox. Mit „Bridged Netzwerk“ fand sich aber schließlich die richtige Einstellung. Der NETGEAR-Router erkennt nun den virtuellen Server quasi durch den realen NVIDIA-Netzwerkadapter und weist ihm über DHCP eine IP-Adresse zu. Somit ist er auch für Vista wie ein ganz normaler Computer im Netzwerk ansprechbar.

Ich muss sagen, dass mir diese Lösung ganz gut gefällt. Wenn der Server nämlich nicht gebraucht wird, belegt er keine Ressourcen und auch der Start von Vista ist dadurch noch schneller, weil er eben nicht mitgeladen werden muss. Desweiteren muss nicht bei jeder Neuinstallation von Windows auch der Server zwangsläufig neu installiert werden. Einfach die virtuelle Festplatte sichern und später wieder zurück kopieren.
Nachdem ich die Blog-Software einigermaßen fertiggestellt hatte, war ich der Meinung, es könnte nicht schaden, den Entwicklungsserver neu aufzusetzen. Ging auch eigentlich ziemlich problemlos, bis zu dem Punkt, an dem ich MySQL und cURL zum Laufen bringen wollte.
Nach ein wenig rumsuchen fand ich dann aber doch die Lösung. Deshalb soll dieser Eintrag auch als Gedächtnisstütze für mich fungieren.
- Apache Server runterfahren
libmysql.dll aus dem MySQL-Ordner nach %windir%/system32 kopieren
- In diesem Zuge auch
libeay32.dll und ssleay32.dll aus dem PHP-Ordner dorthin kopieren
- Apache Server wieder starten
Danach noch die Erweiterungen in der php.ini aktivieren und schon sollte alles wie gewohnt laufen.