====== PHP 5 ====== Datenpark bietet seit längerem parallel zu PHP 4 auch PHP 5 an. Im Herbst 2007 wurden sämtliche Kunden informiert, dass wir auf Anfang 2008 sämtliche Webabos auf PHP 5 umstellen werden. Nun ist es so weit!\\ Dies der Zeitplan der Komplettumstellung: * **Mo, 03. März 2008**: Umstellung sämtlicher Kunden auf PHP5 (Die Option Umschaltung auf PHP 4 bleibt eine weitere Woche im Controlpanel verfügbar) * **Mo, 17. März 2008**: Die Option PHP 4 wird im Controlpanel entfernt, nur noch PHP5 möglich! Bis am 17. März haben Sie also noch Zeit, Ihre PHP-Scripts anzupassen und unter der neuen Umgebung zu testen. Bis dann können Sie jederzeit im [[http://controlpanel.datenpark.ch/|Controlpanel]] unter der Rubrik "Konfiguration" zwischen PHP 4 und 5 umschalten. Die Einstellung ist jeweils spätestens nach 1 min aktiv.\\ Grundsätzlich sollte es keine Probleme geben mit der neuen Version. Da wir aber mit PHP 5 auch gleich ein paar Konfigurations-Änderungen eingeführt haben, müssen Sie ggf. an einigen Stellen eingreifen.\\ Die untenstehenden Tips sollen Ihnen dabei behilflich sein: ===== Upgrade Tips PHP4 nach PHP5 ===== Die aktuelle Konfiguration von PHP 5 ist mittels ''phpinfo()'' ersichtlich ([[http://www.nonprofit.ch/phpinfo.php|Beispiel Kundendomain nonprofit.ch]]).\\ Folgende Konfigurationsparameter haben sich geändert: ^ Konfigurationsparameter ^ PHP4 ^ PHP5 ^ | register_globals | On | **Off** | | allow_url_include | | **Off** | | allow_url_fopen | On | On | | session.gc_maxlifetime | 1440 | **10800** | Während wir aus Sicherheitsgründen ''allow_url_include'' ausgeschaltet haben, bleibt ''allow_url_fopen'' weiterhin eingeschaltet. Beachten Sie bitte die Doku dazu: [[php5#remote_url_includes|Remote URL includes]] ==== register_globals = Off ==== http://www.php.net/manual/en/function.import-request-variables.php\\ http://www.php.net/variables.predefined Die wohl grösste Änderung an der neuen Konfiguration von PHP5 betrifft ''register_globals''. Neu ist dieses Feature ausgeschaltet. Variabeln, die Sie also per ''HTTP_POST'' (meist via HTML-Formular) resp. ''HTTP_GET'' (als Parameter direkt in der URL) übergeben, werden in PHP5 nicht mehr automatisch registriert. Rufen wir beispielsweise ein PHP-script wie folgt auf: http://www.example.com/index.php?id=5\\ Unter PHP4 konnte dann direkt auf die Variable ''$id'' zugegriffen werden: echo $id; **Neu unter PHP5** muss der entsprechende Array verwenden werden, in unserem Fall: echo $_GET['id']; Wir empfehlen Ihnen, diese Änderung an Ihren Scripts vorzunehmen. Falls Ihnen dies definitiv zu umständlich ist und die Umstellung zu aufwendig ist, können Sie auch den folgenden Workaround anwenden: Importieren sämtlicher GET-/POST-/COOKIE-Variabeln mittels ''import_request_variables()''. Binden Sie dazu folgende Zeile in Ihre Scripts ein (am besten in einem globalen include, ''common.inc'' oder ähnlich): import_request_variables('gpc'); Danach sind sämtliche Variabeln direkt verfügbar wie unter PHP4. ==== File upload ==== http://www.php.net/features.file-upload Betrachten wir als Beispiel dieses HTML-Formular zum Upload einer CSV-Datei:
Unter PHP4 konnten wir nun direkt auf die Variable ''$userfile'' zugreifen. Unter PHP5 müssen wir via den Array ''$_FILES['userfile']'' zugreifen. Der Pfad zur hochgeladenen Datei befindet sich in ''$_FILES['userfile']['tmp_name']'' wobei der effektive Dateiname in ''$_FILES['userfile']['name']'' steckt. Wir laden also den Inhalt der Datei wie folgt in die Variable ''$fileContent''. Unter PHP4: if (file_exists($userfile)) { $handle = fopen($userfile, "r"); $fileContent = fread($handle, filesize($userfile)); fclose($handle); } **Neu unter PHP5**: $tmpFile = $_FILES['userfile']['tmp_name']; if (is_uploaded_file($tmpFile)) { $fileContent = file_get_contents($tmpFile); } Importieren Sie den Inhalt von ''$_FILES'' in den globalen Array: foreach ($_FILES as $key => $value) { $GLOBALS[$key] = $_FILES[$key]['tmp_name']; } Danach können Sie wie bis anhin direkt auf die Upload-Variable (in unserem Beispiel ''$userfile'') zugreifen. ==== Session handling ==== http://www.php.net/manual/en/ref.session.php Beachten Sie, dass die Funktion ''session_register()'' neu unter PHP5 nicht mehr funktioniert. Sie liefert keinen Fehler, bewirkt aber auch nichts. Die Session-Variable wird nicht registriert. Neu müssen Sie die Session-Variabeln direkt in den ''$_SESSION'' Array schreiben. Unter PHP4: session_start(); $username = 'test'; session_register('username'); **Neu unter PHP5**: session_start(); $_SESSION['username'] = 'test'; Falls es ihnen nicht möglich ist, den gesamten Code umzuschreiben, können Sie auch folgenden Workaround anwenden: Ersetzen Sie sämtliche Aufrufe von ''session_register()'' durch die eigene Funktion ''my_session_register()'': function my_session_register($name) { $_SESSION[$name] = &$GLOBALS[$name]; } Die Session wird nun also wie bis anhin in PHP4 gesetzt: session_start(); $username = 'test'; session_register('username'); Auf den Folgeseiten muss die ''$_SESSION''-Variable dann "entpackt" werden, damit wir wie bis anhin auf die Variabeln zugreifen können: session_start(); foreach ($_SESSION as $key => $value) { $GLOBALS[$key] = &$_SESSION[$key]; } echo $username; ==== HTTP authentication ==== http://www.php.net/features.http-auth Zur HTTP-Authentikation unter PHP5 müssen Sie ebenfalls den neuen Array ''$_SERVER'' verwenden. Unter PHP4: if ($PHP_AUTH_USER == 'guest' && $PHP_AUTH_PW == 'meinpasswort') { echo 'Sie haben sich erfolgreich eingeloggt!'; } **Neu unter PHP5**: if ($_SERVER['PHP_AUTH_USER'] == 'guest' && $_SERVER['PHP_AUTH_PW'] == 'meinpasswort') { echo 'Sie haben sich erfolgreich eingeloggt!'; } ==== Remote URL includes ==== http://www.php.net/manual/en/function.file-get-contents.php\\ http://www.php.net/manual/en/function.fopen.php In PHP5 wird Ihnen nicht mehr erlaubt, den Inhalt einer externe URL direkt via ''include()'' einzubinden (allow_url_include = Off). Wir bieten Ihnen jedoch weiterhin die Möglichkeit den Inhalt via Funktionen wie ''fopen()'' oder ''file_get_contents()'' einzulesen und damit weiter zu arbeiten (allow_url_fopen = On). Unter PHP4: include('http://www.example.com/'); **Neu unter PHP5**: $content = file_get_contents('http://www.example.com/'); echo $content;