So bereiten Sie Ihre WordPress-Site für PHP 8 vor

Veröffentlicht: 2022-07-06

WordPress-Sites erfordern PHP, und während sich PHP weiterentwickelt hat, hat WordPress mitgehalten. Zuletzt war PHP 7.4 die Standardversion von PHP auf der WordPress VIP-Plattform. Da PHP 7.4 jedoch im November 2022 das Ende seiner Sicherheitsunterstützung erreicht, müssen WordPress-Sites aktualisiert werden, um eine starke Sicherheit aufrechtzuerhalten. Aus diesem Grund wird die WordPress VIP-Plattform alle unsere Kundenanwendungen auf PHP 8.0 umstellen.

Was folgt, ist eine Beschreibung der Änderungen und der Schritte, die sowohl unsere Kunden als auch andere, die WordPress auf anderen Plattformen verwenden, zur Vorbereitung durchführen können.

Inhaltsverzeichnis

  • Die Geschichte von PHP 8.0
    • Neue Eigenschaften
    • Verbreitung der Unterstützung in den PHP- und WordPress-Communities
  • So finden Sie Kompatibilitätsprobleme mit PHP 8.0
    • Verwenden Sie PHP_CodeSniffer mit dem PHPCompatibility-Standard
    • Beheben Sie bekannte PHP-Warnungen, bei denen es sich um fatale PHP-Fehler unter PHP 8.0 handelt
    • Erstellen Sie automatisierte Tests
    • Verwenden Sie PHPStan/Psalm oder ein anderes statisches Analysetool
  • Erste Schritte mit PHP 8.0 auf WordPress VIP
    • Führen Sie die Anwendung lokal aus
    • Überprüfen Sie den VIP Code Analysis Bot auf Pull-Requests
    • Aktivieren Sie PHP 8 in Ihren WordPress-VIP-Anwendungen
    • Nutzen Sie proaktive Hilfe
  • Was ist mit PHP 8.1?

Die Geschichte von PHP 8.0

PHP 8.0 wurde im November 2020 veröffentlicht und bot mehrere Verbesserungen und Funktionen, die neuen Code (und kürzeren Code) widerstandsfähiger gegen Fehler machten.

Die meisten Entwickler werden erhebliche Vorteile in PHP 8.0 finden. Als Hauptversion enthält es jedoch einige Breaking Changes. Das macht den Umstieg von PHP 7.4 auf PHP 8.0 kniffliger als beispielsweise den Wechsel von PHP 7.3 auf PHP 7.4. Insbesondere gab es 49 Breaking Changes am Kern von PHP und 169 in PHP 8 insgesamt, einschließlich in Bibliotheken und Erweiterungen, auf die sich Ihr Code möglicherweise stützt.

Die gute Nachricht ist, dass Unternehmen, sobald sie auf PHP 8.0 umsteigen, bis November 2023 Sicherheitssupport vom zentralen PHP-Projekt erhalten. Nach diesem Datum muss ein Unternehmen auf PHP 8.1 aktualisieren, eine Nebenversion, die eine viel kleinere Änderung erfordert.

Neue Eigenschaften

PHP 8.0 wurde entwickelt, um 1) Grenzfälle und Inkonsistenzen zu beheben, um PHP zu einer solideren und vorhersehbareren Skriptsprache zu machen, und 2) neue Funktionen bereitzustellen, um die Sprache insgesamt zu verbessern. Dazu gehören mehrere neue Syntaxen, die:

  • Erleichtern Sie das Schreiben von streng typisiertem Code, z. B. Union-Typen, static und mixed Typen, Stringable Schnittstelle und Änderungen bei der Behandlung von Zahlen.
  • Reduzieren Sie die Menge an Code, die Sie verwalten müssen, z. B. nullsafe-Operator, Konstruktor-Property-Promotion, match -Operator und nicht erfassende Catches.
  • Code vereinfachen, z. B. ::class für Objekte zulassen, nachgestelltes Komma in Parameterlisten, str_contains() -, str_starts_with() - und str_ends_with() -Funktionen, Throw-Ausdruck, Attribute.

Es enthält auch benannte Parameter. Es ist jedoch erwähnenswert, dass der WordPress-Kern keine Kompatibilität mit dieser Funktion beansprucht. Während Sie also Ihre eigenen benutzerdefinierten Funktionen mit benannten Parametern aufrufen können, sollten Sie keine WordPress-Funktionen aufrufen, da sich die Parameternamen in Zukunft ohne Vorwarnung ändern können.

Verbreitung der Unterstützung in den PHP- und WordPress-Communities

Immer wenn eine neue Version von PHP veröffentlicht wird, die eine neue Syntax enthält, dauert es einige Zeit, bis die neuen Syntaxen in allen PHP- und WordPress-Communitys unterstützt werden.

PHP-Entwicklertools

PHP-Entwicklungstools wie Composer, PHPUnit, PHP_CodeSniffer, PHPStan, Xdebug und verschiedene IDEs müssen alle die neuen Syntaxen einer neuen Version von PHP erkennen. Während PHP kontinuierlich weiterentwickelt wird, kann es zu Verzögerungen kommen, bis das gesamte Ökosystem rund um eine neue Version verfügbar ist. Oft sind die Tools jedoch bereits einsatzbereit, wenn die endgültige Version fertig ist, da die Entwicklungsarbeit auf der Grundlage von Alpha- , Beta- und Release Candidate -Versionen erfolgt ist, die im Voraus verfügbar gemacht wurden. Alle diese Tools und mehr unterstützen jetzt PHP 8.0, was es zu einer guten Wahl für die Entwicklung von PHP-Code und insbesondere für die Entwicklung von WordPress macht.

WordPress-Kern

Als nächstes muss der WordPress-Kern PHP 8.0 unterstützen. Das WordPress-Projekt hat eine lange Geschichte der Kompatibilität mit neuen PHP-Versionen zum Zeitpunkt ihrer Veröffentlichung. Laut diesem gut geschriebenen Beitrag zu Make WP hat WordPress seit der Veröffentlichung von WordPress 5.6 im Dezember 2020 „Beta-Kompatibilität“ mit PHP 8.0. Was bedeutet „Beta-Kompatibilität“? Das bedeutet, dass WordPress auf PHP 8.0 gut laufen kann, aber Funktionen wie das Deklarieren strenger Typen in WordPress-Kerndateien oder die Verwendung benannter Parameter mit WordPress-Kernfunktionen werden nicht unterstützt.

WordPress VIP-Plattform

Die WordPress VIP-Plattform unterstützt seit Mai 2022 PHP 8.0 (und PHP 8.1), einschließlich der Suite von Plugins und Funktionen, mit denen die Plattform die Anforderungen von Unternehmen erfüllen kann.

Plugins von Drittanbietern

WordPress verfügt über Zehntausende von Plugins und die Unterstützung für PHP 8.0 ist sehr unterschiedlich. Beispielsweise könnten neu reservierte Wörter immer noch von einem Plugin verwendet werden, oder Parameter, die an PHP-native Funktionen übergeben werden, sind möglicherweise nicht von dem Typ, der jetzt erwartet wird. Daher können Plugins von Drittanbietern ein Bereich sein, in dem Inkompatibilitäten mit PHP 8.0 Ihre Anwendung beeinträchtigen könnten.

Nachfolgend erfahren Sie, wie Sie einige dieser Inkompatibilitäten überprüfen können. Zu den Optionen gehört, die Upstream-Person/das Upstream-Team zu bitten, die Korrekturen vorzunehmen und eine neue Version zu erstellen, oder ein internes Entwicklungsteam oder eine Agentur, wie einen unserer vorgestellten Partner, zu beauftragen, das Plugin zu forken und die Korrekturen selbst vorzunehmen.

Benutzerdefinierte Plugins

Nahezu jeder Kunde auf der WordPress VIP-Plattform verwendet ein oder mehrere benutzerdefinierte Plugins. Wie Plugins von Drittanbietern müssen auch sie auf Kompatibilität geprüft werden. Es ist im Allgemeinen die beste Vorgehensweise, die ursprünglichen Entwickler zu bitten, die entdeckten Probleme zu beheben.

Designs von Drittanbietern oder benutzerdefinierte Designs

Obwohl Plugins die wahrscheinlichste Quelle für Kompatibilitätsprobleme sind, vergessen Sie nicht, dass auch Drittanbieter- und benutzerdefinierte Designs mit PHP 8.0 kompatibel sein müssen. Derselbe Ansatz zur Überprüfung der Plugin-Code-Kompatibilität gilt für Theme-Code.

So finden Sie Kompatibilitätsprobleme mit PHP 8.0

Es gibt vier Hauptansätze, mit denen Entwicklungsteams Code überprüfen können, um Kompatibilitätsprobleme zu ermitteln:

  1. Verwenden Sie PHP_CodeSniffer mit dem PHPCompatibility-Standard.
  2. Adressieren Sie bekannte PHP-Warnungen, die PHP Fatal Errors unter PHP 8.0 sind.
  3. Erstellen Sie automatisierte Tests.
  4. Verwenden Sie PHPStan/Psalm oder ein anderes statisches Analysetool.

Verwenden Sie PHP_CodeSniffer mit dem PHPCompatibility-Standard

PHP_CodeSniffer (PHPCS) tokenisiert PHP-Dateien und erkennt Verstöße gegen einen definierten Satz von Codierungsstandards. Es gibt Pakete für die WordPress-Codierungsstandards und unsere eigenen VIP-Codierungsstandards (zu deren Verwendung wir Kunden ermutigen).

Es gibt auch Pakete namens PHPCompatibility und PHPCompatibilityWP, und diese Standards analysieren eine Codebasis für PHP-Versionsübergreifende Kompatibilität.

Da die Ergebnisse von den Fähigkeiten und der Bereitschaft des Tools abhängen, ist es wichtig, den develop von PHPCompatibility zu verwenden, bis Version 10 veröffentlicht wird. Version 10 wird die Sniffs in Bezug auf die Kompatibilität mit PHP 8.0 (und PHP 8.1) enthalten. In unseren Dokumenten finden Sie Anweisungen zum Einrichten Ihrer Konfiguration für die Verwendung des develop . Sobald Version 10 veröffentlicht ist, können Sie stattdessen diese Version verwenden.

Das PHPCompatbilityWP-Paket baut auf dem PHPCompatibility-Paket auf, deaktiviert jedoch einige Häkchen für die Abwärtskompatibilitätselemente, die der WordPress-Kern selbst enthält.

Wenn PHPCS und PHPCompatibility/PHPCompatibilityWP eingerichtet sind, können Sie eine Prüfung durchführen:

 phpcs --standard=PHPCompatibilityWP --severity=1 --runtime-set testVersion 8.0- --extensions=php <path-to-code>

Der <path-to-code> könnte ein einzelnes benutzerdefiniertes oder Drittanbieter-Plug-in oder -Design sein, wenn Sie klein anfangen möchten, oder das gesamte Repository, wenn Sie alle Verstöße sehen möchten, die untersucht und behoben werden müssen.

Die Scan-Schritte erkennen nicht jedes mögliche Kompatibilitätsproblem der PHP-Version (z. B. falsche Laufzeitwerttypen), aber sie helfen, die häufigsten Probleme im Zusammenhang mit der Syntax zu identifizieren.

Beheben Sie bekannte PHP-Warnungen, bei denen es sich um fatale PHP-Fehler unter PHP 8.0 handelt

PHP 8.0 sah einige neu klassifizierte Engine-Warnungen, bei denen Warnungen zu schwerwiegenden Fehlern und TypeError-Ausnahmen wurden (und einige Hinweise zu Warnungen wurden). Die PHP-Warntexte, nach denen Sie unter PHP 7.4 suchen müssen, sind:

  • Attempt to assign property '*' of non-object
  • Attempt to modify property '*' of non-object
  • Attempt to increment/decrement property '*' of non-object
  • Creating default object from empty value
  • Cannot use a scalar value as an array
  • Cannot add element to the array as the next element is already occupied
  • Cannot unset offset in a non-array variable
  • Only arrays and Traversables can be unpacked
  • Invalid argument supplied for foreach()
  • Illegal offset type
  • Illegal offset type in isset or empty
  • Illegal offset type in unset
  • Cannot assign an empty string to a string offset
  • Division by zero
  • Use of undefined constant *

Das Beheben dieser Warnungen ist unerlässlich, damit die Anwendung mit PHP 8.0 kompatibel ist.

Hinweis: Unter PHP 8.0 gibt es weitere schwerwiegende Fehler, die unter PHP 7.4 nicht einmal eine Warnung waren. Beispiele beinhalten:

  • Außer dem Konstruktor dürfen private Methoden nicht als final deklariert werden.
  • Ungültige Signaturen für magische Methoden.
  • Signaturvalidierung der abstrakten Trait-Methode
  • Verwendung von parent:: mit einer übergeordneten Klasse.
  • Inkompatible überladene Methodensignaturen (Liskov-Substitutionsprinzip)

Sich mit diesen bekannten Änderungen auseinanderzusetzen, ist ein guter Ausgangspunkt. TypeError wird konsistent für alle internen PHP-Funktionen geworfen, beispielsweise wenn ungültige Parametertypen übergeben werden, auch wenn keine strenge Typprüfung deklariert ist.

Beachten Sie auch, dass der @ -Operator schwerwiegende Fehler unter PHP 8.0 nicht mehr stummschaltet.

Natürlich sollte Ihre Anwendung idealerweise keine Fehler, keine Warnungen und keine Hinweise produzieren. Sie werden ermutigt, sich mit allen zu befassen, die Sie finden. Einige PHP-Warnungen unter 8.x werden beispielsweise unter PHP 9.0 zu schwerwiegenden Fehlern, die möglicherweise zu einer falschen Logik unter PHP 8.x führen. Das Einplanen von Entwicklungszeit vor und nach der Veröffentlichung, um solche Probleme und solche, die während der Entwicklung „entdeckt“ werden, zu beheben, ist eine bewährte Methode. Es ist auch eine Investition in die Stabilität der Website und ihre Fähigkeit, die Akzeptanzkriterien für die zugehörige Funktion genau zu erfüllen.

Erstellen Sie automatisierte Tests

Es gibt viele verschiedene Arten von automatisierten Tests, aber hier meinen wir:

  • Unit -Tests – mimt alle WordPress-definierten Funktionen oder Klassen und benötigt keine Instanz einer Datenbank, um verfügbar zu sein, um die Tests auszuführen.
  • Integrationstests – lädt WordPress und verwendet eine aktuelle Testdatenbank

Dieses Thema ist zu umfangreich, um es hier gut zu behandeln, aber es gibt ein paar Dinge zu beachten:

  • Die Ergebnisse hängen von der Vollständigkeit der Testsuite ab. Wenn Sie nicht viele Tests haben, fehlt Ihnen die notwendige Abdeckung, um die Kompatibilität sicherzustellen.
  • Verwenden Sie strikte Behauptungen. Beispielsweise führt die Verwendung von assertEquals() einen losen Vergleich durch, während assertSame() auch den Typ überprüft.
  • Verwenden Sie eine strikte Codeabdeckung. Fügen Sie beStrictAboutCoversAnnotations=”true” und forceCoversAnnotations=”true” zur PHPUnit-Konfigurationsdatei hinzu und verwenden Sie dann @covers Annotationen, um den genauen Grad der internationalen Codeabdeckung über Tests hinweg zu ermitteln.
  • Testen Sie glückliche (Verhalten basierend auf erwarteten Eingaben) und unglückliche (Verhalten basierend auf unerwarteten Eingaben) Pfade, um sicherzustellen, dass Funktionen wie erwartet fehlschlagen, da hier die meisten Probleme im Zusammenhang mit der Strenge auftreten.
  • Führen Sie Ihre Tests auf PHP 8.0 durch. Für die Integrationstests (WordPress) wurden 2021 Änderungen an der WordPress-Kerntestsuite vorgenommen, die mit den späteren Versionen von PHPUnit freigeschaltet wurden, die wiederum PHP 8.0 unterstützen. Dies wird durch das WP Test Utils-Paket unterstützt, das PHPUnit Polyfills, Brain Monkey- und Mockery-Unterstützung, zusätzliche Funktions-Stubs für WordPress-Funktionen und Zugriff auf alle WP-nativen Test-Utilities wie die Factory-Methoden zur Inhaltserstellung enthält.
  • Erwägen Sie das Schreiben von Tests, bevor Sie eine Fehlerbehebung versuchen, um sicherer zu sein, dass die Kompatibilitätsänderung erfolgreich war.

Verwenden Sie PHPStan/Psalm oder ein anderes statisches Analysetool

Während PHPCS einige Inkompatibilitäten abfängt, gibt es einige Laufzeitänderungen, die PHPCS nicht abfangen soll. Ein Beispiel, das übersehen werden würde, sind native PHP-Funktionen, die strenger sind, welche Typen als Parameter übergeben werden können.

Hier kann ein Tool wie PHPStan, Psalm oder ein anderes statisches Analysetool Abhilfe schaffen. Um jedoch am effektivsten zu sein, erfordern sie, dass Ihre Codebasis entweder strenge Typen (Parameter- und Rückgabetypen im Code) verwendet oder korrekt dokumentiert ist ( @ @param und @return Zeilen in DocBlocks).

Diese Tools verfügen in der Regel über Regelebenen, die es ermöglichen, zuerst die Probleme auf der niedrigsten Ebene zu beheben und das Tool dann schrittweise weiter zu integrieren, um die Qualität Ihrer Codebasis zu verbessern.

Sie können Wissen für Typen für WordPress-Kerncode durch Erweiterungen wie phpstan-wordpress und psalm-plugin-wordpress hinzufügen.

Nach der Konfiguration wird bei jeder Ausführung hervorgehoben, wo Sie unerwartete Typen an Funktionen übergeben, was dazu führen kann, dass schwerwiegende TypeError-Ausnahmen ausgelöst werden. Jedes davon muss behoben werden.

In vielen Fällen können Sie eine TypeError-Ausnahme möglicherweise durch die Verwendung von Try-Catch-Blöcken oder Typumwandlung unterdrücken. Wir empfehlen Ihnen jedoch dringend, dies nicht zu tun. Die Behebung der Grundursache führt zu stärkerem, weniger sprödem und fehleranfälligem Code und zahlt sich auf lange Sicht fast immer aus.

Erste Schritte mit PHP 8.0 auf WordPress VIP

Führen Sie die Anwendung lokal aus

Das lokale Ausführen einer Instanz der Anwendung ist ein sinnvoller erster Schritt, um Kompatibilitätsprobleme erkennen und beheben zu können. Sie können zwar jede lokale Entwicklungsumgebung verwenden, aber um die beste Parität mit der WordPress VIP-Plattform zu gewährleisten, empfehlen wir die VIP Local Development Environment. Indem Sie den Befehl vip dev-env create --php=8.0 (mit VIP-CLI 2.9.5 oder höher) ausführen und dann den Rest des Setup-Assistenten abschließen, wird Ihre Anwendung lokal mit PHP 8.0 ausgeführt.

Überprüfen Sie den VIP Code Analysis Bot auf Pull-Requests

Wenn Sie sich alle Pull-Requests ansehen, die an Ihr Repository unter der wpcomvip-Organisation gesendet wurden, sehen Sie den VIP-Codeanalyse-Bot, der Ihnen Feedback zu PHPCS, PHP-Linting und SVG-Linting gibt.

Für den PHP-Linting-Schritt lint der Bot den PHP-Code mit jeder PHP-Version, die für eine Anwendung verwendet wird, für die das Repository bereitgestellt wird. Wenn diese Version PHP 7.4 ist, wird sie jetzt automatisch auch mit PHP 8.0 linten, um den bevorstehenden Wechsel vorzubereiten.

Aktivieren Sie PHP 8 in Ihren WordPress-VIP-Anwendungen

Sobald Sie so viel wie möglich vor Ort überprüft und behoben haben, ist es an der Zeit, PHP 8.0 in Ihrer WordPress-VIP-Anwendung zu aktivieren. Beginnen Sie mit Ihrer niedrigsten Umgebung und überprüfen Sie, ob alles gut aussieht (einschließlich PHP-Protokolle über vip-cli oder die Integritätsprotokolle im VIP-Dashboard), bevor Sie zur Produktionsumgebung wechseln.

Um PHP 8.0 in einer Umgebung zu aktivieren, öffnen Sie ein Zendesk-Ticket und teilen Sie uns mit, für welche Anwendung und Umgebung Sie es aktivieren möchten.

Wir werden in Kürze eine neue Funktion im VIP-Dashboard veröffentlichen, mit der die PHP-Version geändert werden kann, ohne dass ein Ticket geöffnet werden muss. Überprüfen Sie immer die Lobby auf die neuesten Informationen.

Nutzen Sie proaktive Hilfe

Account-Teams für Premier-Kunden wenden sich bereits an Kunden, um zu besprechen, wie wir sie unterstützen können. Sie erhalten die Ergebnisse von PHPCS und eine Anleitung, wie sie diese Prüfungen selbst durchführen können. PHP-Warnungen, die zu schwerwiegenden Fehlern werden, werden ebenfalls hervorgehoben, um ihnen einen Vorsprung bei der Behebung von Inkompatibilitäten zu geben.

Was ist mit PHP 8.1?

Die WordPress VIP-Plattform unterstützt auch PHP 8.1. Es gibt weniger Änderungen zwischen PHP 8.0 und PHP 8.1 als zwischen PHP 7.4 und 8.0, was bedeutet, dass es weniger Inkompatibilitäten geben sollte, die behoben werden müssen.

PHP8.1:

  • Hat aktive Unterstützung von den PHP-Kernentwicklern bis November 2023 und Sicherheitsunterstützung bis November 2024.
  • Kann mehr Anfragen pro Sekunde verarbeiten als PHP 8.0.
  • Hat „Beta-Kompatibilität“-Unterstützung auf WordPress 5.9 und höher – das bedeutet, dass es in Vorbereitung auf PHP 9 einige Verwerfungshinweise gibt, aber das Verhalten des WordPress-Kerns nicht beeinflusst.

Die nützlichen Änderungen, die für PHP 8.0 erforderlich sind, wie z. B. die Verwendung von strikt typisiertem Code und das Hinzufügen automatisierter Tests, helfen bei der Einführung von PHP 8.1 sowie bei Upgrades für WordPress 6.1, 6.2, 6.3 und höher sowie bei allen Feature-Releases, die Sie vornehmen. Der QA-Prozess ist oft der Engpass, daher kann die Verwendung einiger der Tools und Ansätze, die wir skizziert haben, manuelle Arbeit reduzieren und Ihnen mehr Vertrauen bei der Bereitstellung dieser Änderungen geben.

Wenn Kunden Fragen zu PHP 8.0 haben, eröffnen Sie bitte Tickets bei uns.