PHP 5.6 und 7.0 auf Ubuntu 14.04 (und anderen)

Die LTS Versionen der gängigen Linuxdistributionen (z.B. von Ubunut) haben einen großen Vorteil: sie bieten – nun ja – langfristigen Support und garantieren ebenso lange Systemstabilität. Das macht sie zur ersten Wahl, wenn es um die Frage nach einem stabilen Betriebssystem für professionelles Arbeiten macht. Das bringt aber auch einen Nachteil mit sich: Software hat häufig wesentlich kürzere Entwicklungszyklen als die angelegte Lebensdauer von LTS-Versionen. Das führt dazu, dass bei Ubunut 14.04 mit PHP 5.5 Schluss ist, zumindest wenn man die offiziellen (und als stabil angesehenen) Paketquellen nutzt.

Um das Problem für PHP zu umgehen hat sich das PPA von Ondřej Surý etabliert. Das bietet inzwischen die Möglichkeit PHP in den Versionen 5.5, 5.6 und 7.0 parallel zu installieren. Zu dem Thema gibt es bereits zahlreiche Artikel und Stackexchange-Themen, hiermit möchte zusätzlich ich noch ein paar Details zur Konfiguration und Installation von Modulen teilen.

Ausgangspunkt ist ein Ubunut 14.04 mit PHP 5.5 aus den offiziellen Paketquellen. Zunächst habe ich mich versichert, dass das System auf dem aktuellen Stand ist:

$ sudo apt-get update && sudo apt-get dist-upgrade

Außerdem wird das Paket python-software-properties benötigt. Das war bei mir als python-software-properties3 vorhanden (das lässt sich mit $ dpkg --get-selections | grep python herausfinden). Sicherheitshalber habe ich das Paket noch mit installiert:

$ sudo apt-get install python-software-properties

An dieser Stelle empfiehlt sich ein vollständiges Backup (inkl. /etc).

Die PHP-Konfiguration unter Ubuntu läuft über das Verzeichnis /etc/php5. Dort sind alle verfügbaren Module (Mysql, OPCache, GD, etc.) in mods-availabe/ hinterlegt. Aktive Module sind über ein Symlink in conf.d/ des Unterverzeichnis der jeweiligen API (CLI oder Apache2) hinterlegt:

$ ls -l /etc/php5/cli/conf.d/ | awk '{print $9, $10, $11}'
  
05-opcache.ini -> ../../mods-available/opcache.ini
10-pdo.ini -> ../../mods-available/pdo.ini
20-curl.ini -> ../../mods-available/curl.ini
20-gd.ini -> ../../mods-available/gd.ini
20-imagick.ini -> ../../mods-available/imagick.ini
20-json.ini -> ../../mods-available/json.ini
20-mysqli.ini -> ../../mods-available/mysqli.ini
20-mysql.ini -> ../../mods-available/mysql.ini
20-pdo_mysql.ini -> ../../mods-available/pdo_mysql.ini
20-propro.ini -> ../../mods-available/propro.ini
20-raphf.ini -> ../../mods-available/raphf.ini
20-readline.ini -> ../../mods-available/readline.ini
20-xmlrpc.ini -> ../../mods-available/xmlrpc.ini
20-xsl.ini -> ../../mods-available/xsl.ini
30-http.ini -> ../../mods-available/http.ini

Diese Liste braucht man sich nicht merken, denn nach dem Upgrade liegen die PHP-Konfigurationen innerhalb /etc/php/<VERSION>, überschreiben das bisherige Setup also nicht.

Als nächstes das PPA von Ondřej hinzufügen.

$ sudo add-apt-repository ppa:ondrej/php

Nun habe ich einfach ein komplettes Update aller Pakete gemacht in der Annahme, die php5-* Pakete würden aktualisiert und auf Version 5.6 gehoben werden:

$ sudo apt-get update && sudo apt-get dist-upgrade

Denkste, statt PHP auf 5.6 zu heben, habe ich mir gleich PHP7.0 installiert – zumindest php7.0-cli und ein paar Module. Gut, warum auch nicht, überspringe ich halt 5.6. Ein kurzer Funktionscheck mit WP-CLI auf einem installierten WordPress-System wies mich auf ein dringliches Problem hin: kein MySQL-Modul geladen. Okay, dann installieren wir das doch:

$ sudo apt-get install php7.0-mysql

Das Apache2-Modul arbeitete aber immer noch mit dem PHP 5.5. Interpreter, das zeigte die phpinfo() in einer über HTTP aufgerufenen Datei. Ein Blick in /etc/apache2/mods-available verriet, dass das PHP 7 Modul noch nicht installiert war. Gut, dann installiere ich PHP 7.0 noch mal explizit:

$ apt-get install php7.0

Damit kommt libapache2-mod-php7.0 automatisch mit auf das System, sehr schön. Jetzt müssen wir die Module nur noch austauschen:

$ sudo a2dismod php5
$ sudo a2enmod php7.0
$ sudo service apache2 restart

Et voilà, Apache spricht nun den PHP 7 Interpreter an. So soll das sein.

PHP 7 – läuft

PHP 7 – läuft

Nun ja, der Rest ist fast Routine: Man vergleicht die Module in /etc/php5/[apache2|cli]/conf.d/ mit denen in /etc/php/7.0/[apache2|cli]/conf.d/ und installiert die fehlenden. Bei mir war das nur die GD Bibliothek und MBString:

$ sudo apt-get install php7.0-gd php7.0-mbstring

Die entsprechenden Paketnamen lassen sich über den APT cache herausfinden:

$ sudo apt-cache search "php7.0"

Der wirklich aufwändige Schritt kommt zum Schluss: das Vergleichen und Anpassen der Konfigurationsdateien. Mit diff lassen sich die Unterschiede beider Varianten anzeigen

$ diff -u /etc/php5/[cli|apache2]/php.ini /etc/php/7.0/[cli|apache2]/php.ini

Das sind eine ganze Menge, was irgendwie auch verständlich ist, denn mit PHP 7 wurden einige alte Zöpfe abgeschnitten. Die wichtigsten Werte sind wohl die für das Error-Handling und Resourcen-Limits. Ein Wort zum Schluss: Das PPA von Ondřej wird sehr gut gewartet und funktionierte bei mir bisher einwandfrei. Wenn ihr das auch regelmäßig nutzt, überlegt doch, ihm ein Dankeschön zukommen zu lassen.

Kommentare

Es wurden noch keine Kommentarte zu diesem Artikel geschrieben.

Fragen, Ideen oder Kritik? – Hier ist Platz dafür!

Dein Kommentar

Um ein Kommentar abzugeben, reicht der Text im Kommentarfeld. Die Angabe eines Namens wäre nett, ist aber nicht erforderlich.

Du darfst folgenden HTML-Code verwenden, musst aber nicht:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>