{"id":743,"date":"2016-01-02T12:22:13","date_gmt":"2016-01-02T11:22:13","guid":{"rendered":"https:\/\/d-mueller.de\/blog\/?p=743"},"modified":"2016-01-11T23:27:02","modified_gmt":"2016-01-11T22:27:02","slug":"php-7-migration","status":"publish","type":"post","link":"https:\/\/d-mueller.de\/blog\/php-7-migration\/","title":{"rendered":"PHP 7 Migration"},"content":{"rendered":"<p>Nun war es also Zeit, diesen beschaulichen Server auf PHP7 zu heben.<\/p>\n<h2>Die Installation<\/h2>\n<p>&#8230; lief straight forward, wie man es gewohnt ist. Hier l\u00e4uft ein Apache 2 mit mod_php auf (aktuell) Ubuntu 15.04, also das absolute Standardsetup. Da PHP7 standardm\u00e4\u00dfig noch nicht in ubuntu enthalten ist, m\u00fcssen wir vom <a href=\"https:\/\/launchpad.net\/~ondrej\/+archive\/ubuntu\/php-7.0\">ppa von ondrej<\/a> Gebrauch machen, welches sowohl PHP5.6 als auch PHP7 beinhaltet und regelm\u00e4\u00dfig aktualisiert wird.<\/p>\n<pre data-enlighter-language=\"enlighter\" class=\"EnlighterJSRAW\">\r\napt-get -y purge php5 libapache2-mod-php5 php5 php5-cli php5-common\r\napt-get --purge autoremove\r\napt-get update\r\napt-get install python-software-properties\r\nadd-apt-repository ppa:ondrej\/php-7.0\r\nsudo apt-get install php7.0 php7.0-dev php7.0-mysql php7.0-gd php7.0-curl php7.0-sqlite php7.0-intl\r\nphp -v\r\nservice apache2 restart\r\n<\/pre>\n<p>L\u00e4uft, bei mir folgende Ausgabe:<\/p>\n<pre data-enlighter-language=\"enlighter\" class=\"EnlighterJSRAW\">\r\nPHP 7.0.1-4+deb.sury.org~vivid+1 (cli) ( NTS )\r\nCopyright (c) 1997-2015 The PHP Group\r\nZend Engine v3.0.0, Copyright (c) 1998-2015 Zend Technologies\r\n    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies\r\n<\/pre>\n<h2>Probleme &#038; Fallstricke<\/h2>\n<h3>Imagemagick<\/h3>\n<p>Da es noch kein php7.0-imagemagick gibt, war eine h\u00e4ndische Installation n\u00f6tig:<\/p>\n<pre data-enlighter-language=\"enlighter\" class=\"EnlighterJSRAW\">\r\napt-get install imagemagick\r\ncd \/tmp\r\nwget http:\/\/pecl.php.net\/get\/imagick-3.4.0RC2.tgz\r\ntar xvzf imagick-3.4.0RC2.tgz\r\ncd imagick-3.4.0RC2\r\nphpize\r\n.\/configure\r\nmake install\r\necho extension=imagick.so &gt;&gt; \/etc\/php\/7.0\/cli\/php.ini\r\necho extension=imagick.so &gt; \/etc\/php\/7.0\/apache2\/conf.d\/20-imagick.ini\r\nservice apache2 restart\r\n<\/pre>\n<h3>mcrypt<\/h3>\n<p>Urspr\u00fcnglich habe ich <i>php7.0-mcrypt<\/i> mitinstalliert, welches sich dann per Warning ge\u00e4u\u00dfert hat, dass es bereits geladen wurde.<\/p>\n<pre data-enlighter-language=\"enlighter\" class=\"EnlighterJSRAW\">\r\nModule &#039;mcrypt&#039; already loaded in Unknown on line 0\r\n<\/pre>\n<h2>Die Migration<\/h2>\n<p>WordPress 4.4 vertr\u00e4gt sich gut mit PHP7, zumindest gilt das f\u00fcr den Core. 2 Probleme gab es bei den Plugins:<\/p>\n<p><a href=\"https:\/\/de.wordpress.org\/plugins\/w3-total-cache\/\">w3 total cache<\/a> (aktuell in Version 0.9.4.1) schmei\u00dft einen Haufen Warnings und Fehler, sodass ich es erstmal deaktiviert habe.<\/p>\n<p>Nicht so einfach gestaltete sich das zweite problematische Plugin <a href=\"https:\/\/wordpress.org\/plugins\/codecolorer\/\">CodeColorer<\/a>, welches ich f\u00fcr das Syntax Highlighting verwende. Da es seit \u00fcber 2 Jahren nicht mehr angepasst wurde, ist eine PHP7 Kompatibilit\u00e4t auch nicht direkt zu erwarten gewesen. Problem: Der \/e Modifier in preg_replace ist <a href=\"http:\/\/php.net\/manual\/de\/migration55.deprecated.php\">seit PHP5.5 deprecated<\/a>.<\/p>\n<pre data-enlighter-language=\"enlighter\" class=\"EnlighterJSRAW\">\r\nDeprecated: preg_replace(): The \/e modifier is deprecated, use preg_replace_callback instead in ...\r\n<\/pre>\n<p>Also frisch ans Werk und alle preg_replace-Vorkommen mit dem \/e modifier auf das nun zu verwendende Callback-Format umgestellt:<\/p>\n<p><b>Alt:<\/b><\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\n$content = preg_replace(&#039;#(\\s*)(\\[enlighter[^\\s\\]_]*(?:_[^\\s\\]]*)?[^\\]]*\\].*?\\[\/enlighter\\1\\])(\\s*)#sie&#039;, &#039;$this-&gt;PerformProtectComment(\\&#039;\\\\2\\&#039;, $content, \\&#039;\\\\1\\&#039;, \\&#039;\\\\3\\&#039;);&#039;, $content);\r\n<\/pre>\n<p><b>Neu:<\/b><\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\n$content = preg_replace_callback(&#039;#(\\s*)(\\[enlighter[^\\s\\]_]*(?:_[^\\s\\]]*)?[^\\]]*\\].*?\\[\/enlighter\\1\\])(\\s*)#si&#039;, function($matches)\r\n{\r\n\treturn $this-&gt;PerformProtectComment($matches[2], $content, $matches[1], $matches[3]);\r\n}, $content);\t\r\n<\/pre>\n<h2>Relevante \u00c4nderungen in PHP7<\/h2>\n<p>Ich habe die <a href=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2016\/01\/PHP7-presentation.pdf\">relevantesten \u00c4nderungen in PHP7 in Pr\u00e4sentationsform<\/a> f\u00fcr meine Lehrveranstaltung &#8222;Entwicklung webbasierter Anwendungen&#8220; an der Hochschule Darmstadt zusammengefasst. Die Pr\u00e4sentation darf gerne verwendet werden (auf Anfrage schicke ich auch gerne die ppt).<\/p>\n<p>F\u00fcr mich sind das:<\/p>\n<ul>\n<li>Nach dem <a href=\"http:\/\/stackoverflow.com\/questions\/1993409\/operator-the-elvis-operator-in-php\">Elvis-Operator ?:<\/a> &#8211; Der <a href=\"http:\/\/php.net\/manual\/en\/migration70.new-features.php#migration70.new-features.null-coalesce-op\">Null coalescing &#8222;??&#8220; Operator<\/a>.<\/li>\n<li>Die M\u00f6glichkeit, <a href=\"http:\/\/php.net\/manual\/en\/migration70.new-features.php#migration70.new-features.define-array\">Arrays als Konstanten<\/a> zu definieren.<\/li>\n<li>Die neue <a href=\"https:\/\/trowski.com\/2015\/06\/24\/throwable-exceptions-and-errors-in-php7\/\">Exception und Error-Struktur<\/a>, mit der auch Engine Exceptions gefangen werden k\u00f6nnen.<\/li>\n<li><a href=\"http:\/\/php.net\/manual\/en\/migration70.new-features.php#migration70.new-features.anonymous-classes\">Anonyme Klassen<\/a>.<\/li>\n<li>&#8230; und nat\u00fcrlich die <a href=\"http:\/\/php.net\/manual\/en\/migration70.new-features.php#migration70.new-features.scalar-type-declarations\">skalaren Typen<\/a>.<\/li>\n<\/ul>\n<p>An weggefallenen oder nun veralteten Dingen ist eigentlich nichts von gro\u00dfer praktischer Relevanz.<\/p>\n<ul>\n<li><a href=\"https:\/\/wiki.php.net\/rfc\/remove_php4_constructors\">PHP4 style Konstruktoren<\/a> sind nun deprecated.<\/li>\n<li><a href=\"http:\/\/php.net\/manual\/en\/migration70.deprecated.php#migration70.deprecated.static-calls\">Nicht statische Methoden k\u00f6nnen nun nicht mehr statisch aufgerufen werden.<\/a><\/li>\n<\/ul>\n<p>Ganz lustig ist der <a href=\"http:\/\/php.net\/manual\/de\/migration70.incompatible.php#118424\">&#8222;rant&#8220; \u00fcber das neue &#8222;division by zero&#8220; Verhalten<\/a>. Seit PHP7 ist das Ergebnis beim Teilen durch 0 &#8222;INF&#8220; bzw. &#8222;-INF&#8220;. Eine Warning gibt es zus\u00e4tzlich noch, vor PHP7 kam als Ergebnis &#8222;false&#8220; heraus. Nach <a href=\"https:\/\/de.wikipedia.org\/wiki\/IEEE_754\">IEEE754<\/a> stellt sich die Sache aber nicht ganz so einfach dar. Da es die Warning nach wie vor gibt, sollte auch diese Umstellung keine gro\u00dfen Probleme verursachen.<\/p>\n<h2>In closing<\/h2>\n<p>Auf <a href=\"https:\/\/www.incloud.de\/\">Arbeit<\/a> fahren wir einen Multi PHP-Ansatz, um <a href=\"https:\/\/github.com\/phpbrew\/phpbrew\">mehrere PHP Versionen mit Fast CGI<\/a> parallel laufen zu lassen. Das ist sehr praktisch f\u00fcr eine schrittweise Migration. Symfony ist ja auch schon <a href=\"http:\/\/symfony.com\/blog\/symfony-achieves-100-php7-compatibility\">seit geraumer Zeit<\/a> voll PHP7-f\u00e4hig. Allein aus Gr\u00fcnden des gesunkenen Speicherverbrauchs und der besseren Laufzeitperformance ist man ja quasi schon zum Update gezwungen ;-).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nun war es also Zeit, diesen beschaulichen Server auf PHP7 zu heben. Die Installation &#8230; lief straight forward, wie man es gewohnt ist. Hier l\u00e4uft ein Apache 2 mit mod_php auf (aktuell) Ubuntu 15.04, also das absolute Standardsetup. Da PHP7 &hellip; <a href=\"https:\/\/d-mueller.de\/blog\/php-7-migration\/\">Weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,3],"tags":[],"class_list":["post-743","post","type-post","status-publish","format-standard","hentry","category-php","category-webdev"],"_links":{"self":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts\/743","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/comments?post=743"}],"version-history":[{"count":0,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts\/743\/revisions"}],"wp:attachment":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/media?parent=743"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/categories?post=743"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/tags?post=743"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}