Alle zwei Jahre bringt Ubuntu eine Version mit Langzeit-Pflege heraus. Das jüngst erschienene Ubuntu 16.04 „Xenial Xerus“ ist eine solche LTS-Version, weshalb sie über kurz oder lang auch auf diversen LAMP-Servern installiert sein wird, die Web-Dienste leisten. Umso interessanter ist es, dass hier erstmals bei einem als langzeit-stabil geltenden Ubuntu oder Debian die Version 7 der Scriptsprache PHP mitgeliefert wird.
PHP 7 ist die lang erwartete, schließlich am 3. Dezember 2015 erschienene Renovierung von PHP. Sie löst das 2014 veröffentlichte PHP 5 mit dem aktuellen Versionszweig 5.6 (seit 2014) ab. PHP 6 hat es nie gegeben, nachdem diese Vollversion mehrmals verschoben wurde und schließlich an einem Felsen namens Unicode zerschellte. Nun also PHP 7.
Was ist neu? Viele der damals für PHP 6 geplanten Neuerungen sind bereits in PHP 5.4 ff. geflossen. Das gilt auch für die Umstellung auf Unicode. So ist denn die Liste der Neuerungen gar nicht mehr so aufregend. Einige Fortschritte hin zu einer ernstzunehmenden Programmiersprache macht PHP mit der Einführung einer (optionalen) strikten Prüfung des Variablentyps und bei der Typsicherheit: Methoden können nun mehrere skalare Argumenttypen deklarieren – und erstmals kann auch der Typ des Rückgabewerts festgelegt werden. Entscheidend dürfte aber der generelle Performance-Schub bei PHP 7 sein, ermöglicht durch die Neufassung des PHP-Kerns, der sogenannten Zend-Engine (benannt nach dem israelischen PHP-Hersteller Zend).
Die folgende Befehlszeile installiert in Ubuntu 16.04 den Apache-Webserver samt PHP 7 als Modul und weitere Paket-Abhängigkeiten, wobei libapache2-mod-php lediglich ein Metapaket ist, das wiederum auf libapache2-mod-php7.0 verweist. PHP-Module installiert man nach dem Muster php-modulname, wobei auch dies nur ein Alias für php7.0-modulname ist. Standardmäßig werden die Module für Json und Opcache mit installiert; weitere Module ergänzt man nach eigenen Vorlieben. Im folgenden Beispiel wird die GD-Grafikbibliothek zusätzlich eingerichtet:
# apt install apache2 libapache2-mod-php php-gd
Obacht! Mit der Neu-Paketierung von PHP 7 hat sich die Dateistruktur geändert; auch die Konfigurationsdatei befindet sich nicht mehr am altbekannten Ort:
/etc/apache2/php5/php.ini #alter Ort /etc/php/7.0/apache2/php.ini #neuer Ort
Zurück zu PHP 5.6. Für PHP ist die 7er Version ein echter Meilenstein; dennoch gibt es Gründe, noch bei PHP 5 zu bleiben – sei es, weil veralteter Code das Upgrade verhindert, sei es, weil kein Grund zur Eile besteht, da der aktive Support für PHP 5.6 erst Ende 2016 ausläuft und Sicherheitslücken sogar noch bis Ende 2018 gestopft werden. In diesem Fall helfen die offiziellen Ubuntu-Paketquellen nicht weiter; man muss sich PHP 5.6 anderswo her besorgen. Der Debian-Maintainer Ondřej Surý betreibt dankenswerterweise PPAs für PHP 5.6, 5.5 und 5.4, die sich wie gewohnt in Ubuntu einrichten lassen:
# sudo add-apt-repository ppa:ondrej/php # sudo apt update && sudo apt upgrade
Danach kann man analog zur oben dargestellten Vorgehensweise für PHP 7 das PHP-5.6-Modul für den Apache-Webserver sowie nach Belieben zusätzliche PHP-Module – hier beispielhaft wieder die GD-Bibliothek – installieren:
# sudo apt install libapache2-mod-php5.6 php5.6-gd
Schließlich schaltet man die PHP-Version noch um – beide Versionen können nicht gleichzeitig als Apache-Module aktiv sein:
# a2dismod php7.0 # a2enmod php5.6 # systemctl restart apache2
Nach dem Neustart des Webservers tut wieder PHP 5.6 seinen Dienst. Auf der Kommandozeile wird aber jetzt immer noch php-cli in der 7er-Version ausgeführt. Dies ändert der Befehl:
# update-alternatives --set php /usr/bin/php5.6
Obgleich der PHP-Paketierer Surý bekannt ist und seit Jahren gute Arbeit leistet, sollte man es sich zweimal überlegen, einen Produktiv-Server mit PHP 5.6 aus diesem PPA zu betreiben. Eine LTS-Garantie kann er nicht geben. Sicherer und solider sind immer die direkt von der Distribution ausgelieferten Pakete, sofern sie aus dem „Main“-Repository kommen, für das Ubuntus Fünf-Jahres-Support gilt. Sie nageln das PHP-Paket auf eine getestete, voll funktionstüchtige Version fest und patchen in der Regel nur noch Sicherheitslücken.
Mit anderen Worten: Wer seine „Legacy“-PHP-Skripte noch nicht fit gemacht hat für PHP 7, könnte noch einen Bogen um Ubuntu 16.04 schlagen, zumal die Vorgänger-LTS-Version 14.04 auch noch bis 2019 unterstützt wird. Wer auf Debian Jessie setzt, hat sogar bis 2020 Ruhe. Anders herum: Wer so schnell wie möglich die Vorteile von PHP 7 auf seinem Server genießen möchte, muss nicht mehr länger warten – oder nur noch so lange, bis der Web-Hoster seiner/ihrer Wahl ein passendes Installations-Template anbietet – und kann Ubuntu 16.04 einrichten.
Altlasten. Bei meinen Tests mit (ur-) altem Code erwies sich PHP 7 als erstaunlich nachsichtig. Programmierereien, die schon von PHP 5 mit dem Brandzeichen „Depreciated“ versehen wurden, provozieren immer noch keinen „Fatal Error“. Selbst bei Verstößen gegen objekt-orientierte Prinzipien wie dem statischen Aufruf einer nicht-statischen Methode bricht PHP 7 nicht ab.
Auf Granit beißt dagegen, wer immer noch Funktionen der alten mysql-Erweiterung (statt mysqli oder PDO) verwendet, denn diese API ist nun endlich amputiert worden. In PHP 5.6 steht kann sie letztmalig aus der Versenkung, in der sie besser bleiben sollte, hervorgeholt werden:
# sudo apt install php5.6-mysql # systemctl restart apache2
In PHP 7 funktioniert die analoge Befehlszeile zwar noch:
# sudo apt install php7.0-mysql
Tatsächlich wird aber nicht mehr mysql, sondern mysqli als Modul installiert. Bei Legacy-Code kommt man übrigens mit dem Schnell-Fix, alle mysql-*()-Funktionsaufrufe durch mysqli-*() zu ersetzen, ziemlich weit, das mysqli auch prozedurale Funktionsaufrufe unterstützt.
Ansonsten gilt es, die Migrationshinweise der PHP-Entwickler studieren, um vor einem Update potentielle Fallstricke zu identifizieren und zu eleminieren. Wenn alle Altlasten entsorgt sind, ist das Upgrade auf PHP 7 nämlich sehr lohnenswert.