PHP 7.4 - Lohnt sich das Update?
PHP 7.4 wurde Ende November 2019 veröffentlicht und ist die letzte Nebenversion vor dem Release von PHP 8. Welche neuen Features bringt PHP 7.4 mit sich? Welche Vorteile ergeben sich daraus und wann ist ein Wechsel auf PHP 7.4 sinnvoll? Diesen Fragen gehen wir in unserem Beitrag nach.
Neue Features und Verbesserungen
Die neueste Version der Skriptsprache bringt eine Vielzahl neuer Funktionen mit, deren Ziel es ist, die Geschwindigkeit des Codes zu steigern und dessen Entwicklung zu vereinfachen. Die neuen Feature ermöglichen zudem lesbareren Code zu schreiben. Wir stellen im Folgenden einige Features/Verbesserungen vor - eine vollständige Liste aller Neuerungen gibt es hier.
Performance-Verbesserung
Phoronix hat auch PHP 7.4 im Vergleich zu den Vorgänger-Versionen ausgiebig getestet. Von Version 7.3 zu 7.4 sind zwar keine signifikanten Leistungssteigerungen erkennbar, aber das stetige Ansteigen von Performance in den Versionen ist auch in diesem Fall zu verzeichnen und erfreulich.
Alles in allem bietet auch dieses PHP-Upgrade Vorteile für die Performance von Onlineshops. Durch die Verkürzung von Ladezeiten können möglicherweise Verkäufe gesteigert werden.
Weak References
Weak References erlauben es, Objekte zu erstellen, welche bei Bedarf vom Garbage Collector wieder entfernt werden können.
Beispiel:
$o1 = new MyClass;
$r1 = new WeakRef($o1);
if ($r1->valid()) {
var_dump($r1->get());
}
unset($o1);
if ($r1->valid()) {
var_dump($r1->get());
}
Diese Funktion ist sinnvoll, wenn man Daten cachen möchte, man diese allerdings bei Bedarf aus dem Speicher entfernen kann, wenn der Garbage Collector Speicher freigeben muss. Mit der valid()
-Methode kann geprüft werden, ob die Daten noch im Speicher vorhanden sind oder diese neu berechnet beziehungsweise von einem Sekundärspeicher geladen werden müssen. Vorteil dieser neuen Funktion ist, dass man ohne zusätzliche Dienste eine Cache-Struktur bauen kann, die bei Bedarf Arbeitsspeicher wieder freigibt.
Preloading Funktion
Mit der Einführung der sogenannten Preloading Funktion ist es möglich, den PHP Opcache bereits beim Starten von PHP zu füllen, ohne das die entsprechenden PHP-Dateien erst ausgeführt werden müssen. Dazu wird mit opcache.preload
eine neue Direktive eingebaut, die es erlaubt ein PHP-Skript anzugeben, das beim Start von PHP ausgeführt wird und den OPcache durch includes
oder opcache_compile_file
füllt. Auf diese Weise geladene PHP-Klassen bleiben bis zu einem Neustart von PHP im OPcache erhalten. Dies bedeutet im Gegenzug, das Änderungen an den PHP-Dateien keine Auswirkungen haben bis PHP neugestartet wurde. Durch die neue Preloading Funktion wird die Geschwindigkeit von PHP beim Starten deutlich verbessert. Details dazu gibt es auch im RFC.
Wie hier im Beispiel gezeigt, wird der OPcache durch die Datei a.php
gefüllt. In diesem Fall wird die Datei b.php
in den OPcache geladen:
php.ini:
opcache.preload="/var/www/share/a.php"
a.php:
<?php
opcache_compile_file("/var/www/share/b.php");
Wir evaluieren aktuell noch, ob wir in Zukunft ein Interface für opcache.preload
in unserem Managed Center zur Verfügung stellen. Sollten Sie diese Funktion bis dahin bei uns verwenden wollen, wenden Sie sich bitte an unseren Support.
FFIs
FFI (Foreign Function Interfaces) ist eine neue Erweiterung, die eine einfache Möglichkeit bietet, C-Funktionen aufzurufen, auf C-Variablen zuzugreifen und Datenstrukturen, die in C-Bibliotheken definiert sind, zu erstellen und aufzurufen. Standardmäßig steht diese Funktion nur für die Kommandozeile und für Preload Skripte zur Verfügung.
Beispiel:
<?php
// create FFI object, loading libc and exporting function printf()
$ffi = FFI::cdef(
"int printf(const char *format, ...);", // reguläre C Deklaration
"libc.so.6");
// Rufe die C Funktion "printf()" auf
$ffi->printf("Hello %s!\n", "world");
Mit den FFIs ist es nun möglich, in reinem PHP Erweiterungen zu schreiben und auf externe C-Bibliotheken zugreifen.
Spread Operator
Diese Funktion - auch Argument Unpacking genannt, ist eine verkürzte Schreibweise um Parameter zu vereinen und wird mit PHP 7.4 auf Arrays erweitert. Dadurch kann sie als Alternative zu array_merge()
genutzt werden. Sie wird verwendet, indem man drei Punkte vor einem Array oder vor einer Traversable Instance vorangestellt.
Beispiel:
$arr1 = [1, 2, 3];
$arr2 = [...$arr1]; //[1, 2, 3]
$arr3 = [0, ...$arr1]; //[0, 1, 2, 3]
$arr4 = array(...$arr1, ...$arr2, 111); //[1, 2, 3, 1, 2, 3, 111]
$arr5 = [...$arr1, ...$arr1]; //[1, 2, 3, 1, 2, 3]
function getArr() {
return ['a', 'b'];
}
$arr6 = [...getArr(), 'c']; //['a', 'b', 'c']
$arr7 = [...new ArrayIterator(['a', 'b', 'c'])]; //['a', 'b', 'c']
function arrGen() {
for($i = 11; $i < 15; $i++) {
yield $i;
}
}
$arr8 = [...arrGen()]; //[11, 12, 13, 14]
Der Effekt ist ein wesentlich kürzerer und übersichtlicherer Code, der die Lesbarkeit von Skripten deutlich verbessert. Laut RFC-Dokumentation folgt aus dem Spread-Operator auch eine verbesserte Performance.
Typed properties
Mit PHP 7.4 ist es nun auch möglich, Variablen feste Typen zuzuweisen, wie man es bereits bei vielen anderen Programmiersprachen kennt.
Damit ist es möglich, kürzeren und performanteren Code zu schreiben, wie in diesem Beispiel:
class Example {
// Alle Typen außer "void" and "callable" werden unterstützt
public int $scalarType;
protected ClassName $classType;
private ?ClassName $nullableClassType;
// Typen können auch auf statische Eigenschaften angewandt werden.
public static iterable $staticProp;
// Types können auch mit der "var" Schreibweise gesetzt werden.
var bool $flag;
// Standardwerte sind weiterhin möglich.
public string $str = "foo";
public ?string $nullableStr = null;
// Wenn mehrere Variablen gleichzeitig deklariert werden, gilt der Typ für alle Variablen
public float $x, $y;
}
Arrow Funktion 2.0
Anonyme Funktionen sind bisher in PHP sehr umständich, selbst wenn sie nur eine einfache Operation ausführen. Zum Teil ist dies auf eine große Menge an syntaktischem Boilerplate zurückzuführen und zum Teil auf die Notwendigkeit, verwendete Variablen manuell zu importieren. Dies macht Code, der einfache Closures verwendet, schwer lesbar und unverständlich. Die neue Arrow Schreibweise für anonyme Funktionen 2.0 bietet nun einen Kurzschreibesyntax für die Definition von Funktionen und macht so den Code aufgeräumter und leichter les- und pflegbar.
Beispiel:
<?php
$y = 1;
//vorher
$fn2 = function ($x) use ($y) {
return $x + $y;
};
//neue Arrow-Schreibweise
$fn1 = fn($x) => $x + $y;
Was muss man vor dem Update beachten?
Folgende Schritte empfehlen wir ungeachtet Ihres Shop- bzw CMS-Systems:
- Prüfen Sie die Kompatibilität Ihres Shop- bzw. CMS-Systems mit der Version
- Erstellen Sie ein Backup
- Richten Sie das Update erst auf einer Entwicklungsumgebung ein, sodass Sie Tests durchführen können
- Testen Sie Plugins auf Kompatibilität
- Installieren Sie nach erfolgreichem Test das Update in Ihrer Live-Umgebung
Um die Sicherheit und Stabilität Ihrer Anwendung zu erhöhen, empfehlen wir stets die aktuellste PHP-Version, umso mehr, da die Versionen PHP 5.3 bis PHP 7.1 keine offiziellen Security-Updates mehr erhalten. Auch PHP selbst unterstützt diesen Ansatz unter dem Motto "Keeping Current". Die Vorteile dieses Ansatzes: Sicherheitslücken werden geschlossen, das Leistungspotenzial erhöht, weniger Probleme beim Update sowie bei der Nutzung von Plugins und Erweiterungen und die Vorteile neuer Features können umgehend genutzt werden. Lesen Sie hierzu auch mehr in unserem Blogbeitrag "PHP 7.3 - wann macht ein Wechsel Sinn?"
Kompatibilität von PHP 7.4 mit gängigen Anwendungen
Bevor Sie Ihre PHP-Version aktualisieren, sollten Sie überprüfen, ob die neue Version vollständig mit allen Komponenten kompatibel ist. Die Tabelle zeigt, welche Anwendungen mit PHP 7.4 bereits kompatibel sind (Stand: Juni 2020).
EOL und Roadmap aktueller PHP-Versionen
Sollten Sie sich noch nicht für ein Update entscheiden können oder wollen, lohnt sich auch noch ein Blick auf die Roadmap der existierenden PHP-Versionen. Bereits Ende dieses Jahres läuft der offizielle Support für die Version 7.2 aus. 7.3 wird noch bis zum voraussichtlichen Release von Version 8.0 unterstützt. Neben den offiziellen Sicherheitsupdates erhalten PHP-Versionen ab 5.6 aktuell noch inoffizielle Security-Backports von Microsoft. Diese stehen auch auf unseren Clustern zur Verfügung, dennoch empfehlen wir, möglichst eine aktuelle PHP-Version einzusetzen.
Version | Security-Support |
---|---|
PHP 5.3 | Keine Security-Updates mehr |
PHP 5.4 | Keine Security-Updates mehr |
PHP 5.5 | Keine Security-Updates mehr |
PHP 5.6 | Inoffizielle Security Backports |
PHP 7.0 | Inoffizielle Security Backports |
PHP 7.1 | Inoffizielle Security Backports |
PHP 7.2 | Offizieller Security-Support bis 30.11.2020 |
PHP 7.3 | Offizieller Security-Support bis 06.12.2021 |
PHP 7.4 | Offizieller Security-Support bis 28.11.2022 |
Welche Anwendungen und Shopsysteme sind kompatibel?
Magento 2 und PHP 7.4
Aktuell ist noch keine Version von Magento 2 kompatibel mit PHP 7.4. Wir gehen jedoch davon aus, dass Magento 2 mittelfristig Unterstützung für PHP 7.4 liefern wird.
Update 05.06.2020 - Es ist offiziell: Magento 2.4 wird die neue PHP Version unterstützen. Dafür fliegen PHP 7.1 und 7.2 allerdings raus. Der Release von Magento 2.4 wird im 3. Quartal 2020 erwartet.
Bis dahin empfiehlt Magento für die Version 2.3 des Shopsystems die Nutzung von PHP 7.3.
Update 28.07.2020 - Gute Nachrichten: Heute hat Magento die Version 2.4 released. Damit kann nun auch Magento 2 mit der neuen PHP Version genutzt werden. Wichtig: Wie bereits erwähnt endet mit Magento 2.4 jedoch gleichzeitig auch die Unterstützung für PHP 7.1 und 7.2.
Magento 1 und PHP 7.4
Zur Zeit ist keine Version von Magento 1 kompatibel mit PHP 7.4. Da Magento 1 im Juni 2020 EOL ging, ist hier auch nicht mehr mit offiziellem Support zu rechnen. Der Magento-Fork OpenMage enthält allerdings Patches, die es erlauben Magento 1 mit PHP 7.4 zu betreiben.
Wer plant, noch längere Zeit mit Magento 1 zu fahren, könnte auch Initiativen wie Mage One interessant finden. Neben Patches für die jeweils neuesten Version von PHP, Apache, Nginx und MySQL werden hier weitere Leistungen angeboten, mit denen nach Angaben von Mage One ein Magento 1 Shop nach dem EOL übergangsweise professionell betrieben werden kann.
Shopware 6 und PHP 7.4
Shopware hat angekündigt, dass es kurzfristig Unterstützung für PHP 7.4 geben wird. Bis dahin empfehlen wir die Verwendung von PHP 7.3.
Update 05.06.2020 - Im Forum von Shopware wird bestätigt, dass Shopware 6 mit PHP 7.4 kompatibel ist.
Shopware 5 und 7.4
Shopware hat mitgeteilt, dass es in der Version 5.6.5 Unterstützung für PHP 7.4 geben wird. Auch hier empfehlen wir die Verwendung von PHP 7.3 bis zum offiziellen Release dieser Version.
Update 03.03.2020 - Im Changelog zu Shopware 5.6 wird die Kompatibilität bestätigt.
Wordpress und PHP 7.4
Um sicherzustellen, dass alle Themes und Plugins mit PHP 7.4 funktionieren, sollten Sie im Vorfeld alle Updates von Wordpress gemacht haben. "WordPress continues to encourage all users to run the latest and greatest versions of PHP. This includes PHP 7.4 upon its official release." (Quelle: Wordpress) - dies impliziert zwar, dass die aktuelle Version von WordPress 5.3 einwandfrei mit PHP 7.4 kompatibel ist, allerdings trifft dies nicht in jedem Fall auf die eingesetzten Themes und Plugins zu.
Typo3 und PHP 7.4
Bitte beachten Sie, dass nur die aktuelle Typo3-Version v10 mit PHP 7.4 kompatibel ist. Stellen Sie also sicher, dass Sie im Vorfeld Ihr CMS-System auf die aktuellste Version upgedatet haben und das alle verwendeten Plugins PHP 7.4 unterstützen, bevor Sie auf hierauf updaten.
Profiler (Tideways, Blackfire, New Relic) und PHP 7.4
Sowohl für Tideways als auch Blackfire und New Relic APM stehen bereits mit PHP 7.4 kompatible PHP-Module zur Verfügung. maxcluster-Kunden erhalten diese automatisch, wenn der entsprechende Profiler über unser Managed Center aktiviert wurde. In anderen Fällen ist es ggf. notwendig, das Plugin zu aktualisieren, um PHP 7.4-Unterstützung zu erhalten.
ionCube und PHP 7.4
Mit ionCube und dem ionCube-Loader ist möglich, PHP-Code auszuführen, welcher mit ionCube obfusciert wurde. Für aktuellere Versionen von Shopware ist ein ionCube nicht mehr nötig, bei anderen Anwendungen oder Plugins ist dies allerdings teilweise der Fall. Eine ionCube-Loader-Version, die PHP 7.4 unterstützt, wird für Februar erwartet.
Update: 08.06.2020 - Aktuell gibt es immer noch keine stabile Version, eine zweite Beta Version wurde aber bereits Ende Februar veröffentlicht.
Wechsel auf PHP 7.4: So gelingt das Update
PHP 7.4 individuell einrichten
Sollten Sie kein Managed Hosting verwenden, können Sie PHP selbst herunterladen. Die weitere Vorgehensweise ist vom verwendeten Betriebssystem abhängig:
- Für Debian und Ubuntu basierte Linux-Distributionen empfehlen wir die Pakete von Debian Maintainer Ondřej Surý https://deb.sury.org/. Diese Versionen kommen aktuell auch bei maxcluster zum Einsatz.
- Für RPM basierte Linux-Distributionen können die Pakete von Remi verwendet werden: https://rpms.remirepo.net/wizard/
- Für Entwicklungsumgebungen unter Windows können die Pakete von Ondřej Surý unter WSL verwendet werden: https://docs.microsoft.com/de-de/windows/wsl/install-win10. Alternativ können Sie eine einfache Entwicklungsumgebung mit XAMPP erstellen: https://www.apachefriends.org/de/index.html.
PHP 7.4 bei maxcluster einrichten
Um unsere Kunden zu unterstützen, steht PHP 7.4 bei maxcluster bereits auf allen unseren Ubuntu 18.04-Clustern zur Verfügung. Um PHP 7.4 zu verwenden, genügt es, die Version für den vHost zu aktivieren. Dieser Vorgang lässt sich wieder rückgängig machen, sollte die eingesetzte Anwendung Probleme mit der neuen Version haben.
Sollten Sie noch einen unserer älteren Debian-Cluster nutzen und PHP 7.4 verwenden wollen, prüfen wir gerne die Möglichkeit, auf einen Ubuntu 18.04- oder 20.04-Cluster zu wechseln. Bitte kontaktieren Sie hierzu unseren Support. Unser Team unterstützt Sie gerne auch bei Fragen und Problemen via E-Mail an support@maxcluster.de oder telefonisch unter 05251/41 41 30.
Fazit
Mit PHP 7.4 wurde die Performance erneut verbessert. Dazu kommen neue Code-Konstrukte, die es erlauben, kürzeren und besser strukturierten Code zu schreiben. Online-Shops können sich aus diesem Grund auf kürzere Lade- und Zugriffszeiten sowie eine verbesserte Leistungsfähigkeit freuen. Wir empfehlen daher einen Wechsel auf PHP 7.4, sobald Ihre Anwendung die Version unterstützt.
Obwohl PHP 7.4 die Leistung steigert und die Code-Lesbarkeit deutlich verbessert, wird PHP 8 der eigentliche Meilenstein für die PHP-Performance sein, da der Vorschlag zur Einbindung eines JIT-Compilers bereits genehmigt wurde (A.d.R.: PHP 8.0 wurde am 26.11.2020 released - alle Infos dazu sind im zugehörigen Blog-Artikel zu finden). Hier wird, ähnlich wie bei der JAVA JVM, der PHP-Code vor der Ausführung in Byte Code compiliert, der dann im OPcache gespeichert wird. Hierdurch sind weitere starke Verbesserungen in der PHP-Performance zu erwarten.