Vorladen in PHP 7.4

Die Übersetzung dieses Artikels wurde speziell für Studenten des Backend PHP Developer- Kurses erstellt.



PHP 7.4 fügt das Preloading hinzu, eine Funktion, die die Codeleistung erheblich verbessern kann.

Bei Vorspannung auf den Punkt gebracht.

  • Um die Dateien vorab zu laden, müssen Sie ein separates PHP-Skript schreiben.
  • Dieses Skript wird beim Serverstart einmal ausgeführt.
  • Alle vorinstallierten Dateien stehen für alle Anforderungen im Speicher zur Verfügung.
  • Änderungen an der Quelldatei funktionieren erst, wenn Sie den Server neu starten.

Lassen Sie uns näher auf die neue Funktion eingehen.


Mehr als Opcache


Ja, das Vorladen basiert auf Opcache, aber es ist nicht genau dasselbe. Opcache nimmt die PHP-Quelldateien, kompiliert sie in Opcodes und speichert die kompilierten Dateien auf der Festplatte.

Opcodes können als einfache Darstellung Ihres Codes betrachtet werden, die zur Laufzeit leicht interpretiert werden kann. Mit opcache können Sie also die Phase der Übersetzung der Quelldateien in das überspringen, was der PHP-Interpreter zur Laufzeit tatsächlich benötigt. Deutliche Einsparungen!

Sie können jedoch noch mehr sparen. Mit opcash Dateien opcash wissen nichts über andere Dateien. Wenn Sie Klasse A haben, eine Erweiterung von Klasse B, müssen diese zur Laufzeit noch verknüpft werden. Darüber hinaus prüft der Opcache, ob sich die Quelldateien geändert haben, und macht beim Erkennen der Änderungen ihre Caches ungültig.

Und hier hilft das Preload: Es kompiliert nicht nur die Quelldateien zu Opcodes, sondern verbindet auch abhängige Klassen, Merkmale und Schnittstellen. Es speichert ein solches "kompiliertes" Fragment von ausführbarem Code (dh Code, den der PHP-Interpreter verwenden kann) im Speicher.

Wenn eine Anforderung beim Server eintrifft, kann sie Teile der Codebasis, die bereits in den Speicher geladen wurden, ohne zusätzliche Zeit verwenden.

Über welche „Teile der Codebasis“ sprechen wir?


Übe das Vorladen


Zum korrekten Vorladen muss der Entwickler dem Server mitteilen, welche Dateien heruntergeladen werden sollen. Dies geschieht mit einem einfachen PHP-Skript, sodass nichts zu befürchten ist.

Nichts kompliziertes.

  • Sie stellen ein Preload-Skript bereit und verknüpfen es mit opcache.preload in Ihrer php.ini-Datei.
  • Jede PHP-Datei, die Sie opcache_compile_file() möchten, muss vom Preload-Skript an opcache_compile_file() .

Angenommen, Sie möchten eine Art Framework vorab laden. Lass es Laravel sein. In diesem Fall sollte Ihr Skript alle PHP-Dateien im vendor/laravel und vendor/laravel hinzufügen.

So können Sie dieses Skript in die php.ini aufnehmen:

 opcache.preload=/path/to/project/preload.php 


Und hier ist ein Beispiel für eine Implementierung:

 $files = /*  ,      */; foreach ($files as $file) { opcache_compile_file($file); } 

Anstelle von opcache_compile_file Sie include . Es scheint jedoch, dass hier ein Fehler aufgetreten ist , da zum Zeitpunkt des Schreibens die zweite Option nicht funktioniert hat.

Warnung, dass Sie eine nicht verwandte Klasse nicht vorladen können


Es gibt eine Warnung Kann nicht verknüpfte Klasse nicht vorladen ? Tatsache ist, dass Sie vor dem Vorladen von Dateien auch deren abhängige Objekte vorladen müssen - Schnittstellen, Merkmale und übergeordnete Klassen.

Wenn Sie Probleme mit Klassenabhängigkeiten haben, werden Sie beim Starten des Servers darüber gewarnt:

 Can't preload unlinked class Illuminate\Database\Query\JoinClause: Unknown parent Illuminate\Database\Query\Builder 

Beachten Sie, dass opcache_compile_file() die Datei nur opcache_compile_file() , aber nicht ausführt. Dies bedeutet, dass wenn eine Klasse Abhängigkeiten hat, die nicht vorinstalliert wurden, die Klasse selbst nicht vorinstalliert werden kann.

Dies ist nicht kritisch: Der Server funktioniert wie gewohnt, aber Sie verfügen nicht über alle Dateien, die Sie vorab laden möchten.

Aus diesem Grund müssen Sie die Dateien zum Vorladen sorgfältig auswählen, um Abhängigkeitsprobleme zu vermeiden. Das manuelle Ausführen ist eine undankbare und zeitaufwändige Aufgabe, daher arbeiten Entwickler bereits an automatisierten Lösungen.

Komponistenunterstützung


Die vielversprechendste automatisierte Lösung wird von Komponistenentwicklern vorbereitet, die bereits in den meisten modernen PHP-Projekten verwendet wird.

Jetzt arbeiten die Jungs an der Möglichkeit, das Preload in composer.json zu konfigurieren, wodurch wiederum eine Preload-Datei anstelle von Ihnen generiert wird. Wie das Vorladen selbst befindet sich diese Funktion noch in der Entwicklung. Hier können Sie die Entwicklung der Ereignisse verfolgen.
Glücklicherweise müssen Sie die Preload-Dateien nicht manuell konfigurieren, wenn Sie dies nicht möchten - Composer kann dies für Sie tun.

Serveranforderungen


Es gibt zwei weitere wichtige Punkte, die ein Entwickler bei der Verwendung von Preload berücksichtigen sollte.

Sie wissen bereits, dass Sie einen Eintrag in der php.ini erstellen php.ini damit das Preload funktioniert. Dies bedeutet, dass Sie PHP nicht wie gewünscht konfigurieren können, wenn Sie Shared Hosting verwenden.

In der Praxis benötigen Sie einen dedizierten (virtuellen) Server, um vorinstallierte Dateien für ein einzelnes Projekt zu optimieren. Denken Sie daran.

Denken Sie auch daran, dass Sie den Server jedes Mal neu starten müssen (wenn Sie php-fpm , reicht dies aus), wenn Sie Dateien im Speicher neu laden möchten. Für die meisten ist dies offensichtlich, aber es wird nicht überflüssig sein, sich daran zu erinnern.

Leistung


Nun zur wichtigsten Frage: Verbessert das Vorladen wirklich die Leistung?

Natürlich! Ben Morel teilte die Ergebnisse von Vergleichstests mit, die im selben Thema zum Komponisten zu finden sind , auf das wir oben Bezug genommen haben.

Und das ist auch interessant. Wenn Sie möchten, können Sie nur die sogenannten hot classes - Klassen, die häufig in Ihrer Codebasis verwendet werden. Die Tests von Ben Morel zeigen, dass das Laden von nur etwa 100 dieser Klassen eine höhere Leistungssteigerung bietet als das gleichzeitige Vorladen. Im ersten Fall steigt die Produktivität um 17%, im zweiten um 13%.

Natürlich hängt die Auswahl der Klassen für das Vorladen vom jeweiligen Projekt ab. Der vernünftigste Weg, um zu beginnen, besteht darin, einfach so viel wie möglich vorzuladen. Wenn diese wenigen Prozent Leistungsunterschiede für Sie so wichtig sind, müssen Sie den Code zur Laufzeit steuern.

All diese Vorgänge können natürlich automatisiert werden, und dies wird wahrscheinlich in Zukunft geschehen.

Jetzt ist es wichtig, dass dem composer die Unterstützung vor dem Laden hinzugefügt wird, sodass Sie keine Dateien mehr selbst erstellen müssen. Diese Funktion ist auf dem Server sehr einfach zu konfigurieren, vorausgesetzt, sie steht Ihnen vollständig zur Verfügung.



Verwenden Sie das Preloading in der neuen Version von PHP 7.4? Irgendwelche Gedanken oder Kommentare? Mailen Sie mir auf Twitter oder E-Mail .

Traditionell warten wir auf Ihre Kommentare und Vorteile, wenn Sie den Artikel interessant finden :-)

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


All Articles