Dies ist eine alte Version des Dokuments!
Inhaltsverzeichnis
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, 10. März 2008: Die Option PHP 4 wird im Controlpanel entfernt, nur noch PHP5 möglich!
Bis am 10. März haben Sie also noch Zeit, Ihre PHP-Scripts anzupassen und in der neuen Umgebung zu testen. Bis dann können Sie jederzeit im 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 (Beispiel Kundendomain nonprofit.ch).
Folgende Konfigurationsparameter haben sich geändert:
Konfigurationsparameter | PHP4 | PHP5 |
---|---|---|
register_globals | On | Off |
allow_url_fopen | On | On |
allow_url_include | Off | |
session.gc_maxlifetime | 1440 | 10800 |
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:
<box 90% round orange|WORKAROUND>
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. </box>
File upload
http://www.php.net/features.file-upload
Betrachten wir als Beispiel dieses HTML-Formular zum Upload einer CSV-Datei:
<form action="upload.php" method="post" enctype="multipart/form-data"> <input type="file" maxlenght="1000000" name="userfile" accept="*.csv" /> <input type="submit" name="submitData" value="Uploaden" /> </form>
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); }
<box 90% round orange|WORKAROUND>
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.
</box>
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:
<box 90% round orange|WORKAROUND>
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;
</box>
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()
inzubinden (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;