Die letzten Tage habe ich leider die von mir angekündigten Probleme beim Umzug einer alten PHP Anwendung auf einen PHP5 Server erleben müssen. Die Anwendung hatte ich vor ca. 2 Jahren schon so angepasst das sie mit MySQL 5 zusammen arbeitet und nicht mehr an MySQL 3 gebunden ist. Durch viele verknüpfte SQL Abfragen war das deutlich mehr Aufwand als die Anwendung unter PHP5 lauffähig zu bekommen. Konnte man bei MySQL 3 Abfragen ohne Probleme so formulieren:
SELECT a.name, b.text
FROM a, b
WHERE a.id='X' AND b.id=a.b_id
kommt MySQL 5 damit irgendwie nicht klar. Sogar die Reihenfolge der JOINs spielt eine Rolle. MySQL 5 liefert einem erst wieder Daten wenn die SQL umgebaut wird und so aussieht:
SELECT a.name, b.text
FROM a
LEFT JOIN b ON b.id=a.b_id
WHERE a.id='X'
Das anpassen der SQL's hat damals ca. 3 Tage gedauert. 2002, als die Anwendung entwickelt wurde, war es üblich die SQL Anweisungen selber zusammen zu bauen und direkt von mysql_query() ausführen zu lassen. Eine Datenbankabstraktionsschicht hätte hier aber bei dem Upgrade auf MySQL 5 die Dinge wesentlich vereinfacht. Das sollte man sich für die Zukunft merken und bei neuer Software immer entsprechende Techniken verwenden.
Es gibt einige Bücher und Artikel in Fachzeitschriften die einem bei der Migration von PHP4 Anwendungen in Richtung PHP5 begleiten. Wenn man den Anspruch hat seinen Quelltext so zu refaktorisieren dass er auch die objektorientierten Funktionen von PHP 5 benutzt ist man sicher sehr lange beschäftigt. Bei Anwendungen die noch aktiv weiter entwickelt werden und wo auch immer weiter neue Funktionen eingebaut werden sollen ist ein Refactoring fast unumgänglich. Egal wie lange es dauert.
In meinem Fall ist es aber nicht nötig die Anwendung fit für eine neue Generation zu machen. Ziel ist nur die Anwendung wie sie ist mit PHP5 laufen zu lassen. Laut einigen Statistiken der PHP Group profitiert man immerhin von einem deutlichen Performanzschub.
Ohne den geringsten Anspruch auf Vollständigkeit kann ich nur von wenigen Problemen berichten. Zum einen werden bei den Array-Funktionen seit PHP5 nicht mehr so viel mixed-Parameter erlaubt. array_merge() fügt nur noch Arrays zusammen. Mit einem cast lässt sich dieses Problem sehr leicht mit Suchen und etwas Einfügen beheben.
Etwas gemeiner ist die Tatsache, dass wenn ein Array erwartet wird und diese Variable bis dahin aber nicht initialisierte ist, es eine warning/notice gibt. Kann man sicher abstellen, nur der Hinweis ist doch ganz nett, da hier ein kleines Planungsproblem vorliegt
In objektorientierten PHP4 Anwendungen kann unter anderem das geänderte Verhalten des Konstruktors zu Fehlern führen. Hier ist mehr Aufwand nötig.
Möglich ist alles. Der Wechsel auf PHP5 verläuft meistens sehr problemlos. Nur eins sollte man nicht vergessen: Vorher testen und genug Zeit einplanen!
Ist die Frage, in wie weite ehemalige PHP4 Anwendungen mit PHP6 usw. klar kommen. Allein das $HTTP_SESSION_VARS von PHP6 nicht mehr unterstützt werden, macht mindestens ein Suchen&Ersetzen notwendig.

