PHP 7.4 veröffentlicht! Wie Badoo Upgrades

Heute ist es endlich soweit !


Seine neuen Funktionen wurden bereits mehrfach beschrieben , auch auf Habré . Dies sind Pfeilfunktionen, typisierte Eigenschaften von Klassen und viel mehr syntaktischer Zucker. Vor allem aber warteten wir wegen der Leistung auf ein neues Release: In Version 7.4 erschien nicht nur das Preload, sondern PHP selbst wurde viel schneller.

Schlechte (oder gute?) Nachrichten - Mit der Veröffentlichung von PHP 7.4 wird PHP 7.2 nicht mehr aktiv unterstützt. Seine letzte Veröffentlichung ist für Mitte Dezember geplant. Wir haben lange mit PHP 7.4 experimentiert und sind kürzlich aktiv mit dem Übergang beschäftigt, da wir jetzt auf der fast nicht unterstützten Version 7.2 sind.

Herzlichen Glückwunsch zu der lang erwarteten Veröffentlichung! Im Folgenden werde ich kurz erläutern, wie wir auf die neue Version aktualisieren.

Trotz der Tatsache, dass wir eine riesige Codebasis haben, leben wir seit 13 Jahren in PHP. Wir mussten wiederholt auf neue Versionen aktualisieren, und der Übergangsprozess ist gut etabliert.

Wenn stark vereinfacht, können wir verschiedene Schritte unterscheiden:

  • Wir stellen sicher, dass Unit-Tests mit der neuen Version erfolgreich abgeschlossen werden.
  • Wir machen die Testläufe für die neue Version für alle Codeänderungen obligatorisch (damit Sie Schritt 1 nicht wiederholen müssen, da der neue Code ständig geschrieben wird und möglicherweise erneut inkompatibel ist).
  • Wir wechseln auf die neue Version der Entwicklungsplattform, beheben Probleme und leben einige Zeit in diesem Zustand.
  • Wiederholen Sie dies für die Bereitstellung.
  • Wir verteilen es reibungslos auf verschiedene Produktionscluster.

Unsere Änderungen im PHP-Repository


Problem mit Vorspannung ( Fix )


Diesmal hat sich etwas geändert: Da wir auf das Vorladen gewartet haben, haben wir bereits im Juli mit der Ausführung eines Teils der Arbeiten begonnen, und zwar in Version 7.4.0beta1. Dies hatte zur Folge, dass wir ziemlich viel Zeit für das Debuggen aufbrachten, da PHP 7.4 dann völlig roh war. Andererseits haben wir in der Folge einen unangenehmen Fehler gefunden, ihn behoben und den Fix an den Upstream gesendet, was der gesamten Community geholfen hat.

Dann ist es Zeit, die Tests durchzuführen.

Problem mit dem Zugriff auf private Eigenschaften ( Update )


Um Tests im Allgemeinen ausführen zu können, müssen Sie PHPUnit, SoftMocks und PHP-Parser als Teil davon aktualisieren. Wir haben eine große Codebasis und selbst für die Aktualisierung von PHPUnit war es notwendig, eine große Anzahl von Tests neu zu schreiben.

Nachdem wir es geschafft hatten, die Tests durchzuführen, sahen wir eine sehr seltsame Sache. Es gab viele Abstürze mit folgendem Fehler:

PHP Fatal error: Cannot access private property ClassLoader::$classMap in vendor/composer/ClassLoader.php 

Der Zugriff auf die Privateigenschaft einer Klasse erfolgt nur innerhalb dieser Klasse. PHP meldet jedoch einen Fehler: Sie können nicht auf die Privateigenschaft zugreifen, als ob der Aufruf von einer anderen Klasse stamme.

Das Problem wurde dadurch erschwert, dass es instabil reproduziert wurde. Ein langes Debugging mit gdb hat gezeigt, dass EG (fake_scope) aus irgendeinem Grund nicht die Klasse hat, in der auf die Eigenschaft zugegriffen wird, sondern eine andere, die nichts damit zu tun hat.

Nachdem wir einen minimalen Reproduktionsfall gefunden hatten (der für einen Moment drei Klassen erfordert, einen Autoloader und Reflection), die Ursache des Problems behoben und mit der Behebung im Upstream begonnen hatten, stellte sich heraus, dass dieses Problem seit PHP 7.3 existiert (höchstwahrscheinlich, Nach dieser Wende lebte die ganze Welt für ein Jahr mit ihr und sie störte niemanden vor uns.

Badoo Code Inkompatibilitätsregel


Jetzt korrigieren wir alle Inkompatibilitäten unseres Codes mit PHP 7.4. Die überwiegende Mehrheit der Inkompatibilitäten für uns (mehr als hundert Stellen,> 80% aller Inkompatibilitäten) wurde durch den Fehler "Versuch, auf den Array-Offset für den Wert vom Typ null / bool / int zuzugreifen" ( entsprechend RFC ) verursacht. Es tritt auf, wenn die Syntax des Zugriffs auf ein Array-Element für andere Datentypen verwendet wird.

Das folgende Beispiel veranschaulicht das Problem gut:

 $a = false; var_dump($a['somekey']); // PHP 7.3: // NULL // // PHP 7.4: // Notice: Trying to access array offset on value of type bool in Command line code on line 1 // NULL 

Auf den ersten Blick sollte dies nicht in echtem Code vorkommen, aber wie die Praxis gezeigt hat, ist dies ein ziemlich häufiger Fall: Beispielsweise kann eine Funktion im Normalfall ein Array und im Fehlerfall false / null zurückgeben und die Stack-Informationen über false / null weiter oben ist verloren, und dieser Fall wird nicht separat behandelt.

Dies ist eine ziemlich schwach verbreitete, aber nützliche Änderung in PHP: Sie ermöglicht es Ihnen, viele potenzielle Fehler im Code zu finden.

Das zweite Update in Bezug auf Probleme ist eine Änderung in der Funktionsweise von method_exists (). Im Moment gibt es übrigens keine Informationen dazu in den Versionshinweisen oder im Upgrade-Handbuch. Sein Wesen ist wie folgt:

 class A1 {    private function priv() {} } class B1 extends A1 {} var_dump(method_exists(B1::class, 'priv')); // PHP 7.3: bool(true) // PHP 7.4: bool(false) 

Auch diese Funktion ist in echtem Code nur schwer zu finden. Es stellte sich jedoch heraus, dass wir dies in Tests unbeabsichtigt aktiv ausgenutzt haben.

Natürlich sind wir in unterschiedlichem Maße mit anderen Inkompatibilitäten konfrontiert, einschließlich zahlreicher Änderungen in Bezug auf Reflektion ( Beispiel eins , Beispiel zwei ), Änderungen an hexdec () und dergleichen, Verbot von array_key_exists () sogar für ArrayAccess-Objekte mit Inkompatibilitäten in verschiedenen Abhängigkeitsbibliotheken, die über Composer verbunden sind, und sogar mit allerlei exotischen Dingen wie stream_set_option (), die für Stream-Wrapper zum Einschließen obligatorisch wurden . Insgesamt sind die Kosten für die Anpassung an all diese Änderungen jedoch nicht mit der Syntax von Arrays für Nicht-Arrays zu vergleichen.

Momentan haben wir die Arbeit mit Unit-Tests beendet: Sie bestehen PHP 7.4 vollständig. Wir arbeiten an API-Tests und planen, ab Ende des Jahres verschiedene Cluster und Umgebungen zu wechseln.

Ich möchte Sie zu dieser Diskussion einladen: Haben Sie bereits PHP 7.4 ausprobiert? Wenn ja, wie war Ihre Erfahrung? Wirst du überqueren?

Source: https://habr.com/ru/post/de477822/


All Articles