PHP 7.4 - Lohnt sich das Update?

28.07.2020
extendedLogo

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.

PHP-Benchmark von Phoronix

PHP-Benchmark von Phoronix

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());
}

Quelle: PHP Manual

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");

Wenn jedoch mehrere Anwendungen auf demselben PHP-Server ausgeführt werden, kann dies zu Seiteneffekten führen, da die Klassen jeweils global geladen werden. Sie sollten daher möglichen Seiteneffekten besondere Aufmerksamkeit schenken, wenn Sie diese Funktionalität verwenden.

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");

Quelle: wiki.php.net

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]

Quelle: wiki.php.net

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;
}

Quelle: wiki.php.net

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;

Quelle: wiki.php.net

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).

ShopsystemKompatibilitätAnmerkung
Magento 1möglicher Workaround
Magento 2ab Version 2.4
Shopware 5ab Shopware 5.6.5
Shopware 6laut Shopware Forum
TYPO3ab TYPO3 v10
WordPressab WordPress 5.3
Drupalab Drupal 8.9
Oxid
---------
Matomo (Piwik)ab Matomo 3.12.0
WooCommerceab WooCommerce 3.8
xt:Commerceab xt:Commerce 6.2.x; 7.4.x → Aktuell nur mit xt:Commerce FREE, da noch kein ionCube Loader zur Verfügung steht

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.

VersionSecurity-Support
PHP 5.3Keine Security-Updates mehr
PHP 5.4Keine Security-Updates mehr
PHP 5.5Keine Security-Updates mehr
PHP 5.6Inoffizielle Security Backports
PHP 7.0Inoffizielle Security Backports
PHP 7.1Inoffizielle Security Backports
PHP 7.2Offizieller Security-Support bis 30.11.2020
PHP 7.3Offizieller Security-Support bis 06.12.2021
PHP 7.4Offizieller 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 dahinempfiehlt Magentofü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:

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.

PHP 7.4 für einen vHost bei maxcluster aktivieren

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 imzugehörigen Blog-Artikelzu 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.