Benutzer-Werkzeuge

Webseiten-Werkzeuge


php5

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 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_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: 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:

<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() 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;
php5.txt · Zuletzt geändert: 2008/03/07 23:12 von eri