====== 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;