PHP 7 Migration

Nun war es also Zeit, diesen beschaulichen Server auf PHP7 zu heben.

Die Installation

… lief straight forward, wie man es gewohnt ist. Hier läuft ein Apache 2 mit mod_php auf (aktuell) Ubuntu 15.04, also das absolute Standardsetup. Da PHP7 standardmäßig noch nicht in ubuntu enthalten ist, müssen wir vom ppa von ondrej Gebrauch machen, welches sowohl PHP5.6 als auch PHP7 beinhaltet und regelmäßig aktualisiert wird.

apt-get -y purge php5 libapache2-mod-php5 php5 php5-cli php5-common apt-get --purge autoremove apt-get update apt-get install python-software-properties add-apt-repository ppa:ondrej/php-7.0 sudo apt-get install php7.0 php7.0-dev php7.0-mysql php7.0-gd php7.0-curl php7.0-sqlite php7.0-intl php -v service apache2 restart 

Läuft, bei mir folgende Ausgabe:

PHP 7.0.1-4+deb.sury.org~vivid+1 (cli) ( NTS ) Copyright (c) 1997-2015 The PHP Group Zend Engine v3.0.0, Copyright (c) 1998-2015 Zend Technologies     with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies 

Probleme & Fallstricke

Imagemagick

Da es noch kein php7.0-imagemagick gibt, war eine händische Installation nötig:

apt-get install imagemagick cd /tmp wget http://pecl.php.net/get/imagick-3.4.0RC2.tgz tar xvzf imagick-3.4.0RC2.tgz cd imagick-3.4.0RC2 phpize ./configure make install echo extension=imagick.so >> /etc/php/7.0/cli/php.ini echo extension=imagick.so > /etc/php/7.0/apache2/conf.d/20-imagick.ini service apache2 restart 

mcrypt

Ursprünglich habe ich php7.0-mcrypt mitinstalliert, welches sich dann per Warning geäußert hat, dass es bereits geladen wurde.

Module 'mcrypt' already loaded in Unknown on line 0 

Die Migration

WordPress 4.4 verträgt sich gut mit PHP7, zumindest gilt das für den Core. 2 Probleme gab es bei den Plugins:

w3 total cache (aktuell in Version 0.9.4.1) schmeißt einen Haufen Warnings und Fehler, sodass ich es erstmal deaktiviert habe.

Nicht so einfach gestaltete sich das zweite problematische Plugin CodeColorer, welches ich für das Syntax Highlighting verwende. Da es seit über 2 Jahren nicht mehr angepasst wurde, ist eine PHP7 Kompatibilität auch nicht direkt zu erwarten gewesen. Problem: Der /e Modifier in preg_replace ist seit PHP5.5 deprecated.

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in ... 

Also frisch ans Werk und alle preg_replace-Vorkommen mit dem /e modifier auf das nun zu verwendende Callback-Format umgestellt:

Alt:

$content = preg_replace('#(\s*)(\[enlighter[^\s\]_]*(?:_[^\s\]]*)?[^\]]*\].*?\[/enlighter\1\])(\s*)#sie', '$this->PerformProtectComment(\'\\2\', $content, \'\\1\', \'\\3\');', $content); 

Neu:

$content = preg_replace_callback('#(\s*)(\[enlighter[^\s\]_]*(?:_[^\s\]]*)?[^\]]*\].*?\[/enlighter\1\])(\s*)#si', function($matches) { 	return $this->PerformProtectComment($matches[2], $content, $matches[1], $matches[3]); }, $content);	 

Relevante Änderungen in PHP7

Ich habe die relevantesten Änderungen in PHP7 in Präsentationsform für meine Lehrveranstaltung „Entwicklung webbasierter Anwendungen“ an der Hochschule Darmstadt zusammengefasst. Die Präsentation darf gerne verwendet werden (auf Anfrage schicke ich auch gerne die ppt).

Für mich sind das:

An weggefallenen oder nun veralteten Dingen ist eigentlich nichts von großer praktischer Relevanz.

Ganz lustig ist der „rant“ über das neue „division by zero“ Verhalten. Seit PHP7 ist das Ergebnis beim Teilen durch 0 „INF“ bzw. „-INF“. Eine Warning gibt es zusätzlich noch, vor PHP7 kam als Ergebnis „false“ heraus. Nach IEEE754 stellt sich die Sache aber nicht ganz so einfach dar. Da es die Warning nach wie vor gibt, sollte auch diese Umstellung keine großen Probleme verursachen.

In closing

Auf Arbeit fahren wir einen Multi PHP-Ansatz, um mehrere PHP Versionen mit Fast CGI parallel laufen zu lassen. Das ist sehr praktisch für eine schrittweise Migration. Symfony ist ja auch schon seit geraumer Zeit voll PHP7-fähig. Allein aus Gründen des gesunkenen Speicherverbrauchs und der besseren Laufzeitperformance ist man ja quasi schon zum Update gezwungen ;-).


Deprecated: Directive 'allow_url_include' is deprecated in Unknown on line 0