Heim Backend-Entwicklung PHP7 Neue Funktionen von PHP 8: JIT-Verständnis

Neue Funktionen von PHP 8: JIT-Verständnis

May 29, 2020 am 09:24 AM
jit php php7

Neue Funktionen von PHP 8: JIT-Verständnis

Der JIT-Compiler (Just In Time) von PHP 8 wird als Erweiterung in PHP integriert. Die Opcache-Erweiterung wird verwendet, um bestimmte Opcodes direkt in From-CPU-Anweisungen umzuwandeln .

Das bedeutet, dass Zend VM bei Verwendung von JIT bestimmte Opcodes nicht interpretieren muss und diese Anweisungen direkt als Anweisungen auf CPU-Ebene ausgeführt werden.

JIT von PHP 8

Die Auswirkungen des PHP 8 Just In Time (JIT)-Compilers sind unbestreitbar. Bisher habe ich jedoch festgestellt, dass sehr wenig darüber bekannt ist, was JIT tun soll.

Nach langem Recherchieren und Aufgeben habe ich beschlossen, den PHP-Quellcode selbst auszuprobieren. Durch die Kombination einiger meiner Kenntnisse der C-Sprache und aller Informationen, die ich bisher gesammelt habe, habe ich diesen Artikel verfasst, der Ihnen hoffentlich dabei helfen wird, PHPs JIT besser zu verstehen.

Um es einfach auszudrücken: Wenn die JIT wie erwartet funktioniert, wird Ihr Code nicht über die Zend-VM ausgeführt, sondern direkt als Satz von Anweisungen auf CPU-Ebene.

Das ist die ganze Idee.

Aber um es besser zu verstehen, müssen wir uns überlegen, wie PHP intern funktioniert. Nicht sehr kompliziert, bedarf aber einer Einführung.

Wie wird PHP-Code ausgeführt?

Wie wir alle wissen, ist PHP eine interpretierte Sprache, aber was bedeutet dieser Satz selbst?

Jedes Mal, wenn PHP-Code (Befehlszeilenskript oder WEB-Anwendung) ausgeführt wird, muss er den PHP-Interpreter durchlaufen. Am häufigsten werden die PHP-FPM- und CLI-Interpreter verwendet.

Die Aufgabe des Interpreters ist einfach: PHP-Code empfangen, interpretieren und das Ergebnis zurückgeben.

Allgemein interpretierte Sprachen folgen diesem Prozess. Bei einigen Sprachen entfallen möglicherweise einige Schritte, die Grundidee ist jedoch dieselbe. In PHP ist der Prozess wie folgt:

liest den PHP-Code und interpretiert ihn als eine Reihe von Schlüsselwörtern, sogenannte Tokens. Durch diesen Vorgang weiß der Interpreter, welcher Code in jedem Programm geschrieben wurde. Dieser Schritt wird Lexing oder Tokenizing genannt. Nachdem er die Tokens-Sammlung erhalten hat, versucht der PHP-Interpreter, sie zu analysieren. Ein abstrakter Syntaxbaum (AST) wird durch einen Prozess namens Parsing generiert. Hier ist AST eine Reihe von Knoten, die darstellen, welche Operationen ausgeführt werden sollen. Beispielsweise bedeutet „echo 1 + 1“ tatsächlich „das Ergebnis von 1 + 1 drucken“ oder genauer gesagt „eine Operation drucken, diese Operation ist 1 + 1“. Mit einem AST sind Abläufe und Prioritäten leichter zu verstehen. Um einen abstrakten Syntaxbaum in eine von der CPU ausführbare Operation umzuwandeln, ist ein Übergangsausdruck (IR) erforderlich, den wir in PHP Opcodes nennen. Der Prozess der Konvertierung von ASTs in Opcodes wird als Kompilierung bezeichnet. Bei Opcodes kommt jetzt der spaßige Teil: das Ausführen des Codes! PHP verfügt über eine Engine namens Zend VM, die eine Folge von Opcodes empfangen und ausführen kann. Nachdem alle Opcodes ausgeführt wurden, beendet Zend VM das Programm.

Dieses Diagramm kann es für Sie klarer machen:

Eine vereinfachte Version der Übersicht über den PHP-Interpretationsprozess.

Wie Sie sehen können. Hier ist eine Frage: Auch wenn sich der PHP-Code nicht geändert hat, wird dieser Prozess bei jeder Ausführung befolgt?

Lassen Sie uns einen Blick zurück auf Opcodes werfen. Das ist richtig! Aus diesem Grund gibt es Opcache-Erweiterungen.

Opcache-Erweiterung

Die Opcache-Erweiterung wird mit PHP geliefert und muss normalerweise nicht deaktiviert werden. Wenn Sie PHP verwenden, ist es am besten, Opcache zu aktivieren.

Es fügt Opcodes eine Speicher-Shared-Cache-Ebene hinzu. Seine Aufgabe besteht darin, neu generierte Opcodes aus dem AST zu extrahieren und zwischenzuspeichern, sodass die Schritte Lexing/Tokenizing und Parsing während der Ausführung übersprungen werden können.

Dies ist ein Prozessdiagramm einschließlich der Opcache-Erweiterung:

PHPs Interpretationsprozess unter Verwendung von Opcache. Wenn die Datei bereits analysiert wurde, ruft PHP zwischengespeicherte Opcodes dafür ab, anstatt sie erneut zu analysieren.

Die Schritte Lexing/Tokenisieren, Parsen und Kompilieren werden perfekt übersprungen.

Randbemerkung: Dies ist die fantastische Vorladefunktion von PHP 7.4. RFC ermöglicht es Ihnen, PHP FPM anzuweisen, die Codebasis zu analysieren, in Opcodes umzuwandeln und vor der Ausführung zwischenzuspeichern.

Möchten Sie wissen, wie JIT an diesem Interpretationsprozess beteiligt ist? Dieser Artikel wird es erklären.

Welche Auswirkungen hat die Just-In-Time-Kompilierung?

Nachdem ich mir Zeevs PHP- und JIT-Sendung auf PHP Internals News angehört hatte, fand ich heraus, was JIT eigentlich macht.

Wenn die Opcache-Erweiterung es schneller macht, Opcodes direkt an die Zend-VM zu übertragen, lässt das JIT sie laufen, ohne die Zend-VM zu verwenden.

Zend VM ist ein in C geschriebenes Programm, das als Schicht zwischen Opcodes und der CPU fungiert. JIT generiert kompilierten Code direkt zur Laufzeit, sodass PHP

die Zend-VM überspringen und direkt von der CPU ausgeführt werden kann. Theoretisch wird die Leistung besser sein.

Das klingt seltsam, da für jeden Strukturtyp eine konkrete Implementierung geschrieben werden muss, bevor er in Maschinencode kompiliert werden kann. Aber tatsächlich ist das vernünftig.

PHPs JIT verwendet eine Bibliothek namens DynASM (Dynamic Assembler), die einen Satz von CPU-Anweisungen in einem bestimmten Format in Assembler-Code für viele verschiedene CPU-Typen abbildet. Daher muss der Compiler nur DynASM verwenden, um Opcodes in Maschinencode für eine bestimmte Struktur umzuwandeln.

Allerdings gibt es ein Problem, das mich schon seit langem beschäftigt.

Wenn das Vorladen PHP-Code vor der Ausführung in Opcodes analysieren kann und DynASM Opcodes in Maschinencode kompilieren kann (Just-In-Time-Kompilierung), warum verwenden wir dann nicht sofort die Ahead-of-Time-Kompilierung?

Einer der Gründe, warum ich durch das Anhören von Zeevs Sendung herausgefunden habe, ist, dass PHP eine schwach typisierte Sprache ist, was bedeutet, dass PHP den Typ einer Variablen oft erst kennt, wenn die Zend-VM es versucht einen Opcode ausführen.

Sie können den Union-Typ Zend_value anzeigen, um zu erfahren, dass viele Zeiger auf Variablen unterschiedlichen Typs verweisen. Immer wenn Zend VM versucht, einen Wert von einem Zend_value abzurufen, verwendet es ein Makro wie ZSTR_VAL, um einen Zeiger auf einen String im Union-Typ abzurufen.

Zum Beispiel verarbeitet dieser Zend VM-Handler „kleiner als oder gleich“ (<=)-Ausdrücke. Sehen Sie, wie es so viele if else-Verzweigungen nur zur Typinferenz codiert.

Die Verwendung von Maschinencode zur Ausführung der Typinferenzlogik ist nicht möglich und kann langsamer werden.

Erst auszuwerten und dann zu kompilieren ist ebenfalls keine gute Option, da das Kompilieren in Maschinencode eine CPU-intensive Aufgabe ist. Es ist also auch nicht gut, alles zur Laufzeit zu kompilieren.

Wie wird Just In Time zusammengestellt?

Jetzt wissen wir, dass Typen nicht gut abgeleitet werden können, um sie im Voraus zu kompilieren. Wir wissen auch, dass die Kompilierung zur Laufzeit rechenintensiv ist. Was sind also die Vorteile von JIT für PHP?

Um ein Gleichgewicht zu erreichen, versucht PHPs JIT, nur wertvolle Opcodes zu kompilieren. Dazu analysiert das JIT die Opcodes, die die Zend-VM ausführen wird, und prüft auf mögliche Kompilierungen. (Laut Konfigurationsdatei)

Wenn ein Opcode kompiliert wird, übergibt er die Ausführung an den kompilierten Code und nicht an Zend VM. Es sieht so aus:

PHPs JIT-Interpretationsprozess. Wenn sie kompiliert werden, werden Opcodes nicht von der Zend-VM ausgeführt.

Daher gibt es in der Opcache-Erweiterung zwei Erkennungsanweisungen, um zu bestimmen, ob Opcode kompiliert werden soll. Wenn ja, verwendet der Compiler DynASM, um diesen Opcode in Maschinencode umzuwandeln und diesen Maschinencode auszuführen.

Interessanterweise muss die Codeausführung nahtlos zwischen JIT und interpretiertem Code wechseln können, da es in der aktuellen Schnittstelle ein MB-Limit (auch konfigurierbar) für kompilierten Code gibt.

Übrigens hat mir dieser Vortrag von Benoit Jacquemont über JIT in PHP geholfen, die ganze Sache zu verstehen.

Ich bin immer noch nicht sicher, wann der Kompilierungsteil tatsächlich abgeschlossen wurde, aber ich denke, im Moment möchte ich es nicht wirklich wissen.

Ihre Leistungssteigerung wird also wahrscheinlich nicht riesig sein

Ich hoffe, es ist jetzt klar, warum die meisten PHP-Anwendungen nicht viel von der Verwendung von Just-in-Time-Compilern profitieren Große Leistungssteigerungen. Aus diesem Grund empfiehlt Zeev, dass die Erstellung von Profilen und das Experimentieren mit verschiedenen JIT-Konfigurationen für Ihre Anwendung der beste Ansatz ist.

Wenn Sie PHP FPM verwenden, ist es üblich, kompilierte Opcodes über mehrere Anfragen hinweg zu teilen, aber das ändert immer noch nichts.

Das liegt daran, dass JIT rechenintensive Vorgänge optimiert und die meisten PHP-Anwendungen heutzutage mehr E/A-gebunden sind als alles andere. Wenn Sie trotzdem auf die Festplatte oder das Netzwerk zugreifen, spielt es keine Rolle, ob der Verarbeitungsvorgang kompiliert wird oder nicht. Der Zeitpunkt wird sehr ähnlich sein.

Es sei denn...

Sie machen etwas, das nicht E/A-gebunden ist, wie Bildverarbeitung oder maschinelles Lernen. Alles, was E/A nicht berührt, profitiert von einem JIT-Compiler.

Aus diesem Grund sagen die Leute jetzt, dass wir lieber native Funktionen in PHP schreiben als in C. Wenn diese Funktion trotzdem kompiliert werden würde, wäre der Overhead nicht ausdrucksstark.

Empfohlenes Tutorial: „PHP7

Das obige ist der detaillierte Inhalt vonNeue Funktionen von PHP 8: JIT-Verständnis. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

PHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian PHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 bringt mehrere neue Funktionen, Sicherheitsverbesserungen und Leistungsverbesserungen mit einer beträchtlichen Menge an veralteten und entfernten Funktionen. In dieser Anleitung wird erklärt, wie Sie PHP 8.4 installieren oder auf PHP 8.4 auf Ubuntu, Debian oder deren Derivaten aktualisieren. Obwohl es möglich ist, PHP aus dem Quellcode zu kompilieren, ist die Installation aus einem APT-Repository wie unten erläutert oft schneller und sicherer, da diese Repositorys in Zukunft die neuesten Fehlerbehebungen und Sicherheitsupdates bereitstellen.

So richten Sie Visual Studio-Code (VS-Code) für die PHP-Entwicklung ein So richten Sie Visual Studio-Code (VS-Code) für die PHP-Entwicklung ein Dec 20, 2024 am 11:31 AM

Visual Studio Code, auch bekannt als VS Code, ist ein kostenloser Quellcode-Editor – oder eine integrierte Entwicklungsumgebung (IDE) –, die für alle gängigen Betriebssysteme verfügbar ist. Mit einer großen Sammlung von Erweiterungen für viele Programmiersprachen kann VS Code c

Erklären Sie JSON Web Tokens (JWT) und ihren Anwendungsfall in PHP -APIs. Erklären Sie JSON Web Tokens (JWT) und ihren Anwendungsfall in PHP -APIs. Apr 05, 2025 am 12:04 AM

JWT ist ein offener Standard, der auf JSON basiert und zur sicheren Übertragung von Informationen zwischen Parteien verwendet wird, hauptsächlich für die Identitätsauthentifizierung und den Informationsaustausch. 1. JWT besteht aus drei Teilen: Header, Nutzlast und Signatur. 2. Das Arbeitsprinzip von JWT enthält drei Schritte: Generierung von JWT, Überprüfung von JWT und Parsingnayload. 3. Bei Verwendung von JWT zur Authentifizierung in PHP kann JWT generiert und überprüft werden, und die Funktionen und Berechtigungsinformationen der Benutzer können in die erweiterte Verwendung aufgenommen werden. 4. Häufige Fehler sind Signaturüberprüfungsfehler, Token -Ablauf und übergroße Nutzlast. Zu Debugging -Fähigkeiten gehört die Verwendung von Debugging -Tools und Protokollierung. 5. Leistungsoptimierung und Best Practices umfassen die Verwendung geeigneter Signaturalgorithmen, das Einstellen von Gültigkeitsperioden angemessen.

Wie analysiert und verarbeitet man HTML/XML in PHP? Wie analysiert und verarbeitet man HTML/XML in PHP? Feb 07, 2025 am 11:57 AM

Dieses Tutorial zeigt, wie XML -Dokumente mit PHP effizient verarbeitet werden. XML (Extensible Markup-Sprache) ist eine vielseitige textbasierte Markup-Sprache, die sowohl für die Lesbarkeit des Menschen als auch für die Analyse von Maschinen entwickelt wurde. Es wird üblicherweise für die Datenspeicherung ein verwendet und wird häufig verwendet

PHP -Programm zum Zählen von Vokalen in einer Zeichenfolge PHP -Programm zum Zählen von Vokalen in einer Zeichenfolge Feb 07, 2025 pm 12:12 PM

Eine Zeichenfolge ist eine Folge von Zeichen, einschließlich Buchstaben, Zahlen und Symbolen. In diesem Tutorial wird lernen, wie Sie die Anzahl der Vokale in einer bestimmten Zeichenfolge in PHP unter Verwendung verschiedener Methoden berechnen. Die Vokale auf Englisch sind a, e, i, o, u und sie können Großbuchstaben oder Kleinbuchstaben sein. Was ist ein Vokal? Vokale sind alphabetische Zeichen, die eine spezifische Aussprache darstellen. Es gibt fünf Vokale in Englisch, einschließlich Großbuchstaben und Kleinbuchstaben: a, e, ich, o, u Beispiel 1 Eingabe: String = "TutorialPoint" Ausgabe: 6 erklären Die Vokale in der String "TutorialPoint" sind u, o, i, a, o, ich. Insgesamt gibt es 6 Yuan

Wie setze ich nach dem Neustart des Systems automatisch Berechtigungen von Unixsocket fest? Wie setze ich nach dem Neustart des Systems automatisch Berechtigungen von Unixsocket fest? Mar 31, 2025 pm 11:54 PM

So setzen Sie die Berechtigungen von Unixsocket automatisch nach dem Neustart des Systems. Jedes Mal, wenn das System neu startet, müssen wir den folgenden Befehl ausführen, um die Berechtigungen von Unixsocket: sudo ...

Erklären Sie die späte statische Bindung in PHP (statisch: :). Erklären Sie die späte statische Bindung in PHP (statisch: :). Apr 03, 2025 am 12:04 AM

Statische Bindung (statisch: :) implementiert die späte statische Bindung (LSB) in PHP, sodass das Aufrufen von Klassen in statischen Kontexten anstatt Klassen zu definieren. 1) Der Analyseprozess wird zur Laufzeit durchgeführt.

Was sind PHP Magic -Methoden (__construct, __Destruct, __call, __get, __set usw.) und geben Sie Anwendungsfälle an? Was sind PHP Magic -Methoden (__construct, __Destruct, __call, __get, __set usw.) und geben Sie Anwendungsfälle an? Apr 03, 2025 am 12:03 AM

Was sind die magischen Methoden von PHP? Zu den magischen Methoden von PHP gehören: 1. \ _ \ _ Konstrukt, verwendet, um Objekte zu initialisieren; 2. \ _ \ _ Destruct, verwendet zur Reinigung von Ressourcen; 3. \ _ \ _ Call, behandeln Sie nicht existierende Methodenaufrufe; 4. \ _ \ _ GET, Implementieren Sie den dynamischen Attributzugriff; 5. \ _ \ _ Setzen Sie dynamische Attributeinstellungen. Diese Methoden werden in bestimmten Situationen automatisch aufgerufen, wodurch die Code -Flexibilität und -Effizienz verbessert werden.

See all articles