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