PHP 8.1 - Lohnt sich das Update?

30.11.2021
extendedLogo

Am 25.11.2021, ziemlich genau ein Jahr nach dem großen Major-Release von PHP 8.0, ist mit PHP 8.1 die neueste Version der Skriptsprache erschienen. Auch dieses Release bringt wieder einen ganzen Schwung neuer Features und Verbesserungen mit sich. Doch wann und unter welchen Bedingungen ist ein Wechsel zu PHP 8.1 sinnvoll?

Wir haben die wichtigsten Informationen im folgenden Blogbeitrag zusammengetragen. Da viele Anwendungen erfahrungsgemäß erst in der Folgezeit direkten Support für PHP 8.1 erhalten, werden wir diesen Beitrag über die nächsten Wochen hinweg fortlaufend aktualisieren.

Die neue Version PHP 8.1

Der November 2021 avanciert im PHP-Kosmos zum Monat der Neuigkeiten. Neben dem Release von PHP 8.1 wurde nämlich auch die Gründung der PHP Foundation bekannt gegeben. Dabei handelt es sich um eine gemeinnützige Dachorganisation, die die unabhängige (Weiter-)Entwicklung der Programmiersprache PHP überwacht und gewährleistet. Zu den aktiven Unterstützern der PHP Foundation zählt auch unser Partner Tideways, der übrigens auch schon eine PHP 8.1 Unterstützung für seine gleichnamige Software-Lösung anbietet.

Mit dem Release neuer PHP-Versionen wird allgemein immer das Ziel verfolgt, die Skriptsprache performanter und sicherer zu gestalten und in ihren Anwendungsbereichen zu erweitern. Daher lohnt es sich, den Code einer auf PHP basierenden Webseite stets aktuell zu halten und eine möglichst neue PHP-Version zu verwenden.

Bitte beachten Sie, dass Sie aufgrund der Änderungen bei PHP 8.1 ggf. Anpassungen am Code vornehmen müssen. Obwohl es sich um ein Minor-Release handelt, sind einige Änderungen möglicherweise nicht abwärtskompatibel. Eine Liste über alle nötigen Anpassungen finden Sie in diesem Migrationsleitfaden.

Neue Features und Verbesserungen

PHP 8.1 setzt die Tradition der Vorgänger-Versionen fort und bringt wieder eine Menge neuer Funktionen und Verbesserungen mit sich. Im Folgenden stellen wir Ihnen einige davon im Detail vor. Eine Übersicht über alle implementierten Features finden Sie hier.

Performance

Bereits die Early-Benchmarks von Phoronix, die im Juli 2021 durchgeführt wurden, zeigen, dass PHP 8.1 im direkten Vergleich mit den Vorgänger-Versionen wieder kleine Performance-Verbesserungen mit sich bringt. Verglichen mit PHP 8.0 zeigen die Ergebnisse immerhin eine Verbesserung von drei Prozent.

Performance-Verbesserung mit PHP 8.1 (PHP Benchmark Suite)Performance-Verbesserung mit PHP 8.1 (PHP Benchmark Suite) I Quelle: Phoronix

Performance-Verbesserung mit PHP 8.1 (Zend Bench)Performance-Verbesserung mit PHP 8.1 (Zend Bench) I Quelle: Phoronix

Mehr Performance durch Opcache-Verbesserung

In PHP 8.1 wurden auch Performance-Verbesserungen am Opcache durchgeführt. Das Inheritance Cache genannte Feature ermöglicht es, dass nun alle eindeutig abhängigen Klassen (z.B. Methoden, Schnittstellen, Traits etc.), die zuvor separat kompiliert werden mussten, miteinander verknüpft und im opcache shared memory zwischengespeichert werden können. Laut Entwickler Dmitry Stogov kann die Performance mithilfe dieses Features um fünf bis acht Prozent verbessert werden. Diese Performance-Optimierung kann ohne Änderung des Programmcodes verwendet werden.

Enums

PHP 8.1 erhält mit Enums (Kurzform für Enumerated Types) eine direkte Unterstützung für Datentypen, die einen von mehreren fest definierten Werten annehmen können. Dieses Konstrukt ist vielen Entwicklern bereits aus anderen Programmiersprachen bekannt. Enums sind in PHP-Klassen implementiert und erben daher auch viele Klassen-Semantiken.

Enums unterstützen Funktionen wie Namespaces und Autoloading. Sie können auch Methoden definieren oder genutzt werden, um etwa Klassen zu erweitern oder Schnittstellen zu implementieren. Es ist hingegen nicht möglich, Kindklassen von einem Enum abzuleiten.

Mit Enums wird auch eine neue Syntax etabliert, die der von Traits, Klassen und Schnittstellen ähnelt. In ihrer Basisform werden Enums zunächst mit dem Keyword enum gekennzeichnet, gefolgt von ihrem jeweiligen Namen. Im Anschluss folgen die möglichen Werte, welche jeweils mit dem Keyword case eingeleitet werden.

enum Suit {
  case Hearts;
  case Diamonds;
  case Clubs;
  case Spades;
}

Beispiel: Pure Enum I Quelle: PHP Wiki

Neben diesen sogenannten Pure Enums ermöglicht PHP 8.1 auch den Einsatz von Backend Enums. Bei diesen wird jedem möglichen Wert, den der jeweilige Enum annehmen kann, ein interner String- oder Integer-Wert zugeordnet.

enum Suit: string {
  case Hearts = 'H';
  case Diamonds = 'D';
  case Clubs = 'C';
  case Spades = 'S';
}

Beispiel: Backed Enum I Quelle: PHP Wiki

Ein Backed Enum kann entweder den Typ int oder den Typ string beinhalten. Eine Mischung beider Typen innerhalb des Enums ist jedoch nicht möglich. Ein Enum ist entweder ein Pure oder ein Backed Enum. Daher müssen entweder allen möglichen Werten eines Enums oder keinem dieser Werte String- bzw. Integer-Werte zugeordnet werden.

Fibers

Mit der neuen PHP-Funktion Fibers (auch als green-threads bekannt) können ausgewählte Teile eines Programms isoliert gestartet, angehalten oder beendet werden. Die neue PHP-Klasse /Fiber erlaubt die Implementierung einer Fiber. Fibers sind Codeblöcke, die über ihren eigenen Stack (variables und states) verfügen.

Eine Fiber wird über den Main-Thread gestartet, kann aber während der Ausführung nicht von diesem unterbrochen werden. Nach dem Anhalten oder Beenden einer Fiber kann ihr Neustart wiederum nur über den Main-Thread erfolgen.

Mit Fibers selbst ist es noch nicht möglich, Code parallel auszuführen, da ein aufgerufener Fiber die eigentliche PHP-Ausführung pausiert. In erster Linie sind Fibers daher als Low-Level-Schnittstelle für Framework-Entwickler gedacht. Durch diese Frameworks können dann wiederum Funktionen für die asynchrone Entwicklung mit PHP zur Verfügung gestellt werden.

Fibers funktionieren nach dem “Concurrent execution”-ModellFibers funktionieren nach dem “Concurrent execution”-Modell I Darstellung nach: php.watch

fsync und fdatasync

Mit fsync und fdatasync erhält PHP 8.1 zwei neue Funktionen, die die Gruppe der Dateisystem-Funktionen ergänzen. Beide Funktionen ähneln der bereits existierenden Funktion fflush, die im Kontext von Schreiboperationen (fwrite) genutzt wird, um die Übertragung der PHP-internen Buffer an das Betriebssystem zu gewährleisten.

/**
 * @param resource $stream
 */
function fsync($stream): bool {}

Beispiel: fsync I Quelle: php.watch

/**
 * @param resource $stream
 */
function fdatasync($stream): bool {}

Beispiel: fdatasync I Quelle: php.watch

Zusätzlich senden fsync und fdatasync Requests an das Betriebssystem, damit dieses die Buffer auf das Storage-Medium schreibt. Während fsync Veränderungen an der Datei inklusive der Metadaten synchronisiert, wird fdatasync genutzt, um Dateiänderungen ohne Metadaten zu synchronisieren. Die Verwendung dieser Funktionen ist besonders bei Anwendungen, die auf eine persistente Datenspeicherung ausgelegt sind, sinnvoll, um die Datenintegrität sicherzustellen.

Final Class Constants

Unterklassen sind in der Lage, in PHP-Klassen festgelegte Konstanten zu überschreiben. Mit PHP 8.1 ist es nun auch möglich, Klassen- oder Schnittstellenkonstanten mit final zu markieren. Konstanten, die mit final gekennzeichnet sind, können nicht mehr von Unterklassen überschrieben oder erweitert werden.

class Foo
{
    final public const X = "foo";
}

class Bar extends Foo
{
    public const X = "bar";
}

Beispiel: Final Class Constants I Quelle: PHP Wiki

never Return Type

never ist ein neuer Return-Typ. Funktionen, die mit dem Keyword never versehen sind, geben an, dass niemals ein Wert zurückgegeben wird. Die Funktion wird daher nicht regulär beendet. Stattdessen wird eine Exception ausgelöst oder das Programm durch einen Exit-Call beendet.

function redirect(string $url): never {
    header('Location: ' . $url);
    exit();
}
function redirect(string $uri): never {
    header('Location: ' . $uri);
    exit();
}

function redirectToLoginPage(): never {
    redirect('/login');
    echo 'Hello'; // <- dead code detected by static analysis
}

Beispiel: never Return Type I Quelle: php.net

never ähnelt dem bereits vorhandenen Return-Typen void, denn auch dieser gibt an, dass eine Funktion niemals einen Wert zurückgibt. Im Gegensatz zu never beendet void jedoch nicht den Programm-Flow, sodass PHP die nächste Anweisung nach dem Funktionsaufruf weiter ausführt.

Readonly Properties

PHP 8.1 macht es möglich, Klasseneigenschaften als schreibgeschützt zu kennzeichnen. Wird das Keyword readonly in eine typisierte Eigenschaft implementiert, kann diese nach der Initialisierung nicht mehr verändert werden. Schreibgeschützte Eigenschaftswerte können dabei ausschließlich innerhalb der Klasse selbst gesetzt werden.

class Test {
    public readonly string $prop;

    public function __construct(string $prop) {
        $this->prop = $prop;
    }
}

Beispiel Readonly Property I Quelle: PHP Wiki

array_is_list

PHP-Arrays enthalten entweder integer- oder string-Keys und sind in ihren Anwendungsmöglichkeiten sehr flexibel. Mit ihnen können auch umfangreichere Strukturen dargestellt werden. Bislang gab es jedoch noch kein Feature, mit dem kontrolliert werden konnte, ob es sich bei einem bestimmten Array um eine Liste handelt.

Die neue Funktion array_is_list tut genau dies, indem sie die enthaltenen Array-Keys beginnend beim Wert 0 in Bezug auf das Vorhandensein einer numerischen Reihenfolge überprüft. Je nachdem, ob das zutrifft oder nicht, gibt die Funktion einen der booleschen Werte true oder false aus. Mithilfe von array_is_list können potenzielle Fehlerquellen, die sogar zu erheblichen Performance-Problemen führen können, umgangen werden.

array_is_list([]); // true
array_is_list(['apple', 2, 3]); // true
array_is_list([0 => 'apple', 'orange']); // true

// The array does not start at 0
array_is_list([1 => 'apple', 'orange']); // false

// The keys are not in the correct order
array_is_list([1 => 'apple', 0 => 'orange']); // false

// Non-integer keys
array_is_list([0 => 'apple', 'foo' => 'bar']); // false

// Non-consecutive keys
array_is_list([0 => 'apple', 2 => 'bar']); // false

Beispiel: array_is_list I Quelle: PHP Wiki

Weitere Neuerungen

Neben den bereits beschriebenen Features hat PHP 8.1 eine Vielzahl weiterer Neuerungen zu bieten. Einige davon finden Sie hier im Überblick:

  • Pure Intersection Types ähneln den in PHP 8.0 eingeführten Union Types und sind insbesondere bei Anwendungen, die mit vielen Schnittstellen interagieren, sehr nützlich.
  • Array-Unpacking ist jetzt auch mit string-Keys möglich.
  • Mit New In Initializers können neue Schlüsselwörter als Standardparameter in Funktionsdefinitionen und an weiteren Stellen verwendet werden.
  • Die neue First-Class Callable Syntax vereinfacht die Erstellung von Callables mit derselben Syntax, mit denen Methoden und Funktionen aufgerufen werden.
  • Die GD-Erweiterung in PHP 8.1 bietet nun auch Unterstützung für das AVIF-Bildformat. Vor der Verwendung muss GD zunächst mit der AVIF-Unterstützung kompiliert werden.
  • Die Option, den FPM-Status im openmetrics-Format darzustellen, erlaubt eine einfachere Anbindung an Monitoring-Tools wie Prometheus.

Hier finden Sie die vollständige Liste aller Änderungen.

Was muss man vor dem Update beachten?

Die neuen Features von PHP 8.1 sind für Sie interessant und Sie denken über ein Update nach? Unabhängig von Ihrem Shop- oder CMS-System sollten Sie vor dem Update unbedingt folgende Dinge beachten:

  1. Prüfen Sie, ob Ihr Shop- bzw. CMS-System (bereits) mit PHP 8.1 kompatibel ist.
  2. Sicherheit steht an erster Stelle: Erstellen Sie daher unbedingt ein Backup, bevor Sie mit dem Update beginnen.
  3. Richten Sie eine Entwicklungsumgebung ein und installieren Sie dort das PHP-Update. Mit der Durchführung von Tests können Sie das Update in der Praxis prüfen und erhalten so noch mehr Sicherheit. Vergessen Sie dabei nicht, auch Ihre eingesetzten Plugins auf Kompatibilität zu testen.
  4. Prüfen Sie Ihren eigenen Code anhand des PHP-Migrationsleitfadens auf notwendige Änderungen.
  5. Falls Ihre Tests erfolgreich waren, steht der Installation des Updates auch in Ihrer Live-Umgebung nichts mehr im Weg.

Erhöhen Sie die Sicherheit und Stabilität Ihrer Anwendung, indem Sie ‒ sofern möglich ‒ immer die aktuellste PHP-Version nutzen. Ist das nicht umsetzbar, verwenden Sie möglichst eine Version, die offizielle Security-Updates erhält. Je aktueller Ihre PHP-Version ist, desto höher ist in der Regel auch das Leistungspotenzial Ihrer Anwendung. Außerdem werden Sie weniger Probleme hinsichtlich der Nutzung von Features und Erweiterungen bei der Nutzung von Plugins haben.

Kompatibilität von PHP 8.1 mit gängigen Anwendungen

Die neuen Features und Verbesserungen von PHP 8.1 haben Sie überzeugt und Sie wollen Ihre Anwendung umgehend auf die neue Version umstellen? Anhand der Tabelle können Sie überprüfen, mit welchen gängigen Shop- oder CMS-Systemen PHP 8.1 kompatibel ist:

Shopsystem / CMS Kompatibilität Anmerkung
Magento 1 Mit einer offiziellen Unterstützung ist nicht zu rechnen, da Magento 1 bereits End-of-Life ist
Magento 2 Unterstützung von PHP 8.1 ab Version 2.4.4
Shopware 5 Unterstützung von PHP 8.1 ab Version 5.7.7
Shopware 6 (✓) Unterstützung von PHP 8.1 ab Version 6.4.9.0 (ab Professional Edition)
TYPO3 Unterstützung von PHP 8.1 ab Version v11.5.3
WordPress / WooCommerce (✓) Beta-Support von PHP 8.1 ab Version 5.9
Drupal Sowohl Drupal 9 als auch Drupal 10 sind mittlerweile mit PHP 8.1 kompatibel
Oro Commerce Oro Commerce ist mittlerweile mit PHP 8.1 kompatibel
Weitere Anwendungen Kompatibilität Anmerkung
Matomo (Piwik) Matomo verfügt mittlerweile über eine Unterstützung von PHP 8.1
Tideways Unterstützung ab Version 2021.3

Welche Anwendungen und Shopsysteme sind kompatibel?

Hier finden Sie weitere Details zur (geplanten) Kompatibilität von PHP 8.1 mit gängigen Shop- und CMS-Systemen. Die fehlenden Informationen werden wir Ihnen nachreichen, sobald diese verfügbar sind.

Magento 2 und PHP 8.1

Magento 2 unterstützt PHP 8.1 ab der Version 2.4.4, die am 12. April 2022 erschienen ist.

Magento 1 und PHP 8.1

Aufgrund des End-of-Life von Magento 1 ist nicht davon auszugehen, dass es eine offizielle Unterstützung für PHP 8.1 geben wird. Im Rahmen des Magento-Forks "OpenMage Magento LTS" wird aktuell an einer Unterstützung für PHP 8.0 gearbeitet. Auch durch das Projekt “Mage One” sind möglicherweise demnächst entsprechende Patches verfügbar. Mehr dazu in unserer FAQ.

Shopware 6 und PHP 8.1

Mit der am 14. März 2022 veröffentlichen Version 6.4.9.0 wurde eine Kompatibilität mit PHP 8.0 sowie 8.1 hergestellt. Diese ist aktuell allerdings ausschließlich in der Professional und der Enterprise Edition von Shopware 6 verfügbar. Wir rechnen fest damit, dass PHP 8.1 in Kürze auch mit der Community Edition kompatibel ist.

Shopware 5 und PHP 8.1

Mit dem Update auf Version 5.7.7, das am 05. Januar 2022 veröffentlicht wurde, ist Shopware 5 mit PHP 8.1 kompatibel.

WordPress / WooCommerce und PHP 8.1

WordPress und WooCommerce bieten ab der WordPress-Version 5.9 Beta-Support für PHP 8.1 an. Es besteht also grundsätzlich eine Kompatibilität, jedoch kann es nach der Installation zu Problemen kommen.

TYPO3 und PHP 8.1

Die aktuelle TYPO3-Version v11.5.3, die am 16. November 2021 releast wurde, ist bereits mit PHP 8.1 kompatibel.

EOL und Roadmap aktueller PHP-Versionen

Natürlich müssen Sie noch keinen Wechsel auf PHP 8.1 vornehmen, dennoch sollten Sie einen Blick auf die Roadmap der aktuellen Versionen werfen, um Ihre nächsten Schritte zu planen. Einige Versionen erhalten noch inoffizielle Security-Backports, die auch auf unseren Clustern zur Verfügung stehen. Wir empfehlen jedoch, möglichst eine aktuelle Version einzusetzen. Insbesondere der offizielle Support für PHP 7.4 läuft noch in diesem Jahr aus.

Version Security-Support
<= 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 Inoffizielle Security Backports
PHP 7.3 Inoffizielle Security Backports
PHP 7.4 Offizieller Security-Support bis 28.11.2022
PHP 8.0 Offizieller Security-Support bis 26.11.2023
PHP 8.1 Offizieller Security-Support bis 25.11.2024

Wechsel auf PHP 8.1: So gelingt das Update

PHP 8.1 individuell einrichten

Sollten Sie kein Managed Hosting verwenden, können Sie PHP 8.1 auch individuell einrichten. Hierzu laden Sie vorab die aktuelle Version herunter. Abhängig von Ihrem verwendeten Betriebssystem ist dann die weitere Vorgehensweise:

Debian und Ubuntu: Für diese Linux-Distributionen empfehlen wir die Pakete vom Debian Maintainer Ondřej Surý, die wir auch bei maxcluster im Einsatz haben.

RPM: Für Linux-Distributionen auf Basis von RPM können die Pakete von Remi verwendet werden.

Windows: Für Entwicklungsumgebungen unter Windows können wiederum die Pakete von Ondřej Surý unter WSL verwendet werden. Alternativ können Sie sich eine einfache Entwicklungsumgebung mit XAMPP erstellen.

PHP 8.1 bei maxcluster einrichten

Bei maxcluster steht PHP 8.1 ab dem 30.11.2021 auf allen Ubuntu-Clustern zur Verfügung. Wenn Sie es für Ihre Anwendung verwenden möchten, genügt es, wenn Sie die Version für den vHost in unserem Managed Center aktivieren. Sollte die eingesetzte Anwendung Probleme mit dieser neuen Version haben, lässt sich der Vorgang umgehend wieder rückgängig machen.

Aktivierung von PHP 8.1 im Managed CenterAktivierung von PHP 8.1 im Managed Center I Quelle: maxcluster

Sie nutzen noch einen unserer älteren Debian-Cluster und möchten gerne PHP 8.1 verwenden? Wenn Sie prüfen möchten, ob ein Wechsel auf einen Ubuntu-Cluster 18.04 bzw. 20.04 möglich ist, wenden Sie sich jederzeit gerne an unseren Support. Unser Team unterstützt Sie gerne auch bei anderen Fragen und Problemen via E-Mail an support@maxcluster.de oder telefonisch unter 05251/41 41 30.

Fazit

PHP 8.1 wartet mit einer Menge nützlicher Features und Verbesserungen auf. Viele Entwickler sind sich schon jetzt sicher, dass die neue Version im direkten Vergleich mit PHP 8.0 in Bezug auf Leistung und Performance wieder einen deutlichen Sprung nach vorn macht. Gerade für Onlineshops kann das Upgrade auf PHP 8.1 sehr lohnenswert sein, da die verbesserte Performance kürzere Ladezeiten und mehr Stabilität zur Folge hat.


Zuletzt aktualisiert am 29.09.2022 | DR