1&1 beendet PHP4-Unterstützung – typische Migrationsprobleme auf PHP5.4

Laut einer E-Mail an seine Kunden und einem Blogpost beendet Deutschlands größter Webhoster 1&1 zum 01.04.2013 seine Unterstützung von PHP4 und PHP 5.2. Ab diesem Tag laufen alle gehosteten PHP-Skripte standardmäßig auf PHP 5.4. Wer verhindern möchte, dass alte Webseiten nicht mehr laufen, sollte also vorher schon reagieren und seine Skripte migrieren. Eine kleine Anleitung zur Behebung von drei möglichen Fallstricken:

  1. Problem: register_globals – Seiten mit URL-Parametern funktionieren nicht mehr
  2. Problem: Veraltete/Deprecated Funktionen
  3. Problem: MySQL-Datenbank-Zugriffe funktionieren nicht mehr

Vorbereitung: PHP-Version ändern

  1. Login ins Kundencenter unter http://login.1und1.de
  2. „Webspace / Globale PHP-Version“ klicken
  3. PHP-Version auf „php 5.4“ umstellen
  4. Speichern

Mehr Infos auch auf der offiziellen Hilfeseite zur Änderung der PHP-Version. Nach ein paar Minuten sollten dann alle Skripte des Webspaces standardmäßig mit PHP 5.4 laufen. Wer es testen möchte: Einfach eine Datei mit dem Namen phpinfo.php erzeugen und mit <?php phpinfo(); ?> füllen. Der Aufruf der Datei im Browser sollte nun PHP 5.4 als PHP-Version zurückmelden.

Problem 1: register_globals – Seiten mit URL-Parametern funktionieren nicht mehr

Die globalen Variablen sind in PHP 5.4 standardmäßig deaktiviert. Also müssen alle Referenzen zu URL-Parametern ersetzt werden. Kommt irgendwas als script.php?foo=bar herein, reichte früher noch $foo um an den Wert „bar“ zu kommen. Nun muss $_REQUEST[„foo“] genutzt werden.

Wer aus zeitgründen Panik schiebt und erstmal möglichst schnell umstellen möchte, kann auch den Quick&Dirty-Fix von http://php.net/manual/de/security.globals.php#Hcom82213 verwenden. Aus Sicherheitsgründen ist aber dringend zu empfehlen wirklich auf globale Variablen zu verzichten.

Problem 2: Veraltete/Deprecated Funktionen

Einige PHP-Funktionen wie split() wurden in PHP5 durch neue ersetzt, der Aufruf der alten Funktionen wirft hier Warnungen. Bei Aufruf einer PHP-Datei mit solchen Funktionen ist dies an der folgenden Fehelrmeldung zu erkennen:

Deprecated: Function split() is deprecated in /homepages/33/d12345679/htdocs/foo.com/script.php on line 23

Im PHP-Handbuch finden sich Upgrade-Empfehlungen zu den entsprechenden neuen PHP-Funktionen, wie z.B. unter http://de2.php.net/manual/de/function.split.php. Wer es eilig hat, kann aber auch vorerst nur die „Deprecated“ Warnungen an sich deaktivieren und auf eigene Gefahr die alten Funktionen weiter nutzen. Hierzu kann im PHP-Skript das Level für Fehlermeldungen geändert werden, z.B. mit dem Aufruf der Funktion error_reporting(E_USER_DEPRECATED); mehr Infos unter http://de3.php.net/manual/de/function.error-reporting.php und http://php.net/manual/de/errorfunc.constants.php.

Bei einzelnen Funktionsaufrufen unterdrückt ein @ vor der Funktion wie gewohnt Fehlermeldungen, also z.B. @split(„,“,“foo,bar,baz“).

Problem 3: MySQL-Datenbank-Zugriffe funktionieren nicht mehr

Ein Problem, das mich getroffen hat: Auf allen Seiten mit Daten aus einer MySQL-Datenbank tat sich nichts mehr. Mein Problem war das folgende: Einige Webseiten waren schon so alt, dass sie noch MySQL4-Datenbanken nutzten. Ein kurzes debuggen mit mysql_error() nach mysql_connect() lieferte mir „Connecting to 3.22, 3.23 & 4.0 servers is not supported„. Im 1&1-Control-Center fand sich dann der Übeltäter: Eine uralte MySQL4-Datenbank zwischen all den anderen MySQL5-Datenbanken. Als Lösung erzeugte ich einfach eine neue MySQL5-Datenbank und importierte die alten Daten:

Datenbank exportieren:

  1. Ins 1&1-Control-Center unter http://login.1und1.de einloggen
  2. „Webspace / MySQL“ klicken
  3. Auf „phpMyAdmin“ neben der alten MySQL4-DB klicken
  4. Im phpMyAdmin Links die Datenbank anklicken, z.b. „db1234567890“
  5. Rechts auf den Reiter „exportieren“
  6. Die Checkbox „senden“ anklicken
  7. Mit „OK“ bestätigen
  8. Die Export-SQL-Datei herunterladen und lokal speichern

MySQL5-Datenbank neu erstellen:

  1. Ins 1&1-Control-Center unter http://login.1und1.de einloggen
  2. „Webspace / MySQL“ klicken
  3. „Neue Datenbank“ klicken
  4. Beschreibung und Passwort eingeben
  5. „Einrichten“ klicken
  6. Nach ein paar Minuten ist die Datenbank eingerichtet
  7. Nun können in den PHP-Scripts die MySQL-Verbindungsdaten geändert werden (Server, Datenbankname, User, Password)

Daten importieren (über phpMyAdmin – nur bis 50 MB Dateigröße):

  1. Ins 1&1-Control-Center unter http://login.1und1.de einloggen
  2. „Webspace / MySQL“ klicken
  3. Auf „phpMyAdmin“ neben der neuen MySQL5-DB klicken
  4. Links den Tab „SQL“ anklicken
  5. Den Tab „Dateiimport“ auswählen und die vorhin erzeugte Export-Datei auswählen

Daten importien (über SSH, falls Datei größer als 50 MB):

  1. SQL-Datei per WinSCP oder FTP auf den Webspace hochladen
  2. Per SSH einloggen (falls im Tarifpaket verfügbar)
  3. „mysql -h DBSERVER –user=DBUSER –password=DBPASSWORD DBNAME < SQLDATEI
    also z.B.
    „mysql -h db123456789.db.1and1.com –user=dbo1234567890 –password=mypassword db123456789 < db123456789.export.sql“

Fazit

Viel Erfolg beim Update Eurer alten Seiten. Und immer dran denken: Quick&Dirty Fixes lösen ein Problem nicht, sondern schieben es nur auf und sind unsicher. – Also besser immer gleich vernünftig updaten und den sicheren Weg nehmen :)