Heim  >  Artikel  >  Backend-Entwicklung  >  Lernen Sie die Innovation und Leistungsoptimierung von PHP7 kennen

Lernen Sie die Innovation und Leistungsoptimierung von PHP7 kennen

coldplay.xixi
coldplay.xixinach vorne
2020-06-24 17:26:103049Durchsuche

Lernen Sie die Innovation und Leistungsoptimierung von PHP7 kennen

PHP hat eine 20-jährige Geschichte hinter sich. Man kann sagen, dass PHP7 eine große Innovation im Vergleich zur Vorgängerserie von PHP5 ist, insbesondere in Bezug auf die Leistung, die eine erreicht hat deutliche Verbesserung sprunghaft. PHP ist eine weltweit verbreitete Webentwicklungssprache. Die Innovation von PHP7 wird sicherlich tiefgreifendere Änderungen für diese Webdienste mit sich bringen.

Hier ist ein Diagramm aus Brother Birds PPT (82 % der Websites verwenden PHP als Entwicklungssprache):

( Hinweis: Eine Website kann mehrere Sprachen als Entwicklungssprache verwenden)
(Hinweis: Dieser Artikel enthält viele Screenshots von Bruder Niaos PPT und das Urheberrecht der Bilder liegt bei Bruder Niao)

Wir Schauen wir uns zunächst die beiden spannenden Leistungstestergebnisse an.


Die Leistungstestergebnisse von PHP7. Als Ergebnis des Leistungsstresstests sank der Zeitverbrauch von 2,991 auf 1,186, ein deutlicher Rückgang von 60 %.

WordPress QPS-Stresstest (Bild von PPT):

Im WordPress-Projekt PHP7 im Vergleich zu PHP5.6 stiegen die QPS um das 2,77-fache.

Nachdem wir den spannenden Vergleich der Leistungstestergebnisse gelesen haben, kommen wir zur Sache. Es gibt viele neue Funktionen in PHP7, wir werden uns jedoch mehr auf die wichtigsten Änderungen konzentrieren.

1. Neue Funktionen und Änderungen

1. Skalare Typdeklarationen und Skalartypdeklarationen (Skalartypdeklarationen und Skalartypdeklarationen)

PHP-Sprache Ein sehr wichtiges Feature ist die „schwache Typisierung“, die das Schreiben von PHP-Programmen sehr einfach macht und Anfängern einen schnellen Einstieg ermöglicht, wenn sie mit PHP in Kontakt kommen. Dies ist jedoch auch mit einigen Kontroversen verbunden. Man kann sagen, dass die Unterstützung der Definition von Variablentypen eine innovative Änderung darstellt. PHP beginnt damit, Typdefinitionen auf optionale Weise zu unterstützen. Darüber hinaus wird auch eine Switch-Anweisung „declare(strict_type=1)“ eingeführt. Sobald diese Anweisung aktiviert ist, wird das Programm unter der aktuellen Datei gezwungen, strikte Funktionsparameter-Übertragungstypen und Rückgabetypen zu befolgen.

Eine Add-Funktion plus eine Typdefinition kann beispielsweise so geschrieben werden:

In Kombination mit der obligatorischen Typwechselanweisung kann sie so geschrieben werden:

Wenn strict_type nicht aktiviert ist, wird PHP versuchen, Ihnen bei der Konvertierung in den erforderlichen Typ zu helfen. Nach dem Einschalten wird PHP geändert und keine Typkonvertierung mehr durchgeführt Wenn der Typ nicht übereinstimmt, wird ein Typfehler ausgegeben. Das sind großartige Neuigkeiten für Schüler, die „stark typisierte“ Sprachen mögen.

Detailliertere Einführung: PHP7 Scalar Type Declaration RFC [Übersetzung]

2. Mehr Fehler werden zu abfangbaren Ausnahmen

PHP7 implementiert eine globale ausführbare Schnittstelle. Die ursprüngliche Ausnahme und einige Fehler implementieren diese Schnittstelle (Schnittstelle) und definieren die Vererbungsstruktur von Ausnahmen in Form von Schnittstellen. Dadurch werden mehr Fehler in PHP7 zu abfangbaren Ausnahmen und werden an Entwickler zurückgegeben. Wenn sie nicht abgefangen werden, handelt es sich um Fehler. Wenn sie abgefangen werden, werden sie zu Ausnahmen, die innerhalb des Programms behandelt werden können. Bei diesen Fehlern, die abgefangen werden können, handelt es sich in der Regel um Fehler, die dem Programm keinen schwerwiegenden Schaden zufügen, wie beispielsweise eine Funktion, die nicht vorhanden ist. PHP7 vereinfacht die Verarbeitung für Entwickler weiter und gibt Entwicklern eine größere Kontrolle über das Programm. Denn standardmäßig führt ein Fehler direkt dazu, dass das Programm unterbrochen wird, und PHP7 bietet die Möglichkeit, ihn zu erfassen und zu verarbeiten, sodass das Programm weiterhin ausgeführt werden kann, was Programmierern flexiblere Auswahlmöglichkeiten bietet.

Um beispielsweise eine Funktion auszuführen, bei der wir nicht sicher sind, ob sie existiert oder nicht, besteht die PHP5-kompatible Methode darin, die Beurteilung function_exist anzuhängen, bevor die Funktion aufgerufen wird, während PHP7 die Methode zum Abfangen von Ausnahmen unterstützt.

Wie in der Abbildung unten gezeigt (der Screenshot stammt aus der PPT):

3. AST (Abstract Syntax Tree, abstrakter Syntaxbaum)

AST spielt die Rolle einer Middleware im PHP-Kompilierungsprozess und ersetzt die ursprüngliche Methode, Opcode direkt vom Interpreter auszuspucken, wodurch der Interpreter (Parser) und der Compiler (Compliler) entkoppelt werden, was einige reduzieren kann Hacken Sie Code und machen Sie gleichzeitig die Implementierung einfacher zu verstehen und zu warten.
PHP5:

PHP7:

Weitere AST-Informationen: https://wiki.php.net/rfc/abstract_syntax_tree

4. Natives TLS (Native Thread Local Storage, Native Thread Local Storage)

PHP muss das Problem der „Thread-Sicherheit“ (TS, Thread Safe) im Multithread-Modus lösen (z. B. die Woker- und Event-Modi des Webservers Apache, die multithreaded sind), da Threads gemeinsam genutzt werden Der Speicherbereich des Prozesses. Daher muss jeder Thread selbst auf irgendeine Weise einen privaten Bereich erstellen, um seine eigenen privaten Daten zu speichern und eine gegenseitige Kontamination mit anderen Threads zu vermeiden. Die von PHP5 übernommene Methode besteht darin, ein großes globales Array zu verwalten und jedem Thread einen unabhängigen Speicherplatz zuzuweisen. Threads greifen über ihre eigenen Schlüsselwerte auf diese globale Datengruppe zu.

In PHP5 muss dieser eindeutige Schlüsselwert an jede Funktion übergeben werden, die globale Variablen verwenden muss. PHP7 ist der Ansicht, dass diese Übergabemethode nicht benutzerfreundlich ist und einige Probleme aufweist. Versuchen Sie daher, eine globale Thread-spezifische Variable zu verwenden, um diesen Schlüsselwert zu speichern.
Verwandte native TLS-Probleme:
https://wiki.php.net/rfc/native-tls

5. Weitere neue Funktionen

PHP7 neue Funktionen und Änderungen nicht Leider gehen wir hier nicht ins Detail.
(1) Int64-Unterstützung, Vereinheitlichung der Ganzzahllänge auf verschiedenen Plattformen, Unterstützung von Zeichenfolgen und Datei-Uploads mit mehr als 2 GB.
(2) Einheitliche Variablensyntax.
(3) Konsistentes foreach-Verhalten
(4) Neue Operatoren <=>, ??
(5) Unterstützung des Unicode-Zeichenformats (u{xxxxx})
(6) Unterstützung anonymer Klassen (Anonyme Klasse)
… …

2. Sprunghafter Leistungsdurchbruch: Volle Kraft voraus

1 🎜>

Just In Time (Just-in-Time-Kompilierung) ist eine Softwareoptimierungstechnologie, die Bytecode zur Laufzeit in Maschinencode kompiliert. Aus intuitiver Sicht ist es für uns leicht zu glauben, dass Maschinencode direkt von Computern erkannt und ausgeführt werden kann und dass es effizienter ist als Zend, Opcode zu lesen und einzeln auszuführen. Unter ihnen verwendet HHVM (HipHop Virtual Machine, HHVM ist eine virtuelle Open-Source-PHP-Maschine von Facebook) JIT, was ihren PHP-Leistungstest um eine Größenordnung verbessert und schockierende Testergebnisse veröffentlicht, was uns auch intuitiv denken lässt, dass JIT ein leistungsstarker ist Technologie, die Stein in Gold verwandelt.

Tatsächlich haben Bruder Niao und Dmitry (einer der Entwickler des PHP-Sprachkerns) im Jahr 2013 einmal einen JIT-Versuch mit der PHP5.5-Version unternommen (sie wurde nicht veröffentlicht). Der ursprüngliche Ausführungsprozess von PHP5.5 besteht darin, den PHP-Code durch lexikalische und syntaktische Analyse in Opcode-Bytecode zu kompilieren (das Format ähnelt in gewisser Weise der Assemblierung). Anschließend liest die Zend-Engine diese Opcode-Anweisungen, analysiert sie und führt sie einzeln aus.

Und sie führten nach dem Opcode-Link eine Typinferenz (TypeInf) ein und generierten dann vor der Ausführung ByteCodes über JIT.

Als Ergebnis wurden im Benchmark (Testprogramm) spannende Ergebnisse erzielt. Nach der Implementierung von JIT stieg die Leistung im Vergleich zu PHP5.5 um das Achtfache. Als sie diese Optimierung jedoch in das eigentliche Projekt WordPress (ein Open-Source-Blogging-Projekt) einbauten, stellten sie fast keine Leistungsverbesserung fest und erhielten ein rätselhaftes Testergebnis.
Deshalb nutzten sie das Profiltyp-Tool unter Linux, um den CPU-Zeitverbrauch der Programmausführung zu analysieren.
Verteilung des CPU-Verbrauchs bei 100-maliger Ausführung von WordPress (Screenshot von PPT):

Hinweis:
21 % der CPU-Zeit werden für die Speicherverwaltung aufgewendet.
12 % der CPU-Zeit werden für Hash-Tabellenoperationen aufgewendet, hauptsächlich für das Hinzufügen, Löschen, Ändern und Überprüfen von PHP-Arrays.
30 % der CPU-Zeit werden für integrierte Funktionen wie strlen aufgewendet.
25 % der CPU-Zeit werden in VM (Zend Engine) verbracht.

Nach der Analyse wurden zwei Schlussfolgerungen gezogen:

(1) Wenn die von JIT generierten ByteCodes zu groß sind, führt dies zu einer Verringerung der CPU-Cache-Trefferrate (CPU Cache Miss)

Da es im PHP5.5-Code keine offensichtliche Typdefinition gibt, können wir uns nur auf die Typinferenz verlassen. Definieren Sie die Variablentypen, auf die so weit wie möglich geschlossen werden kann, und entfernen Sie dann in Kombination mit der Typinferenz Zweigcodes, die nicht von diesem Typ sind, und generieren Sie direkt ausführbaren Maschinencode. Allerdings kann die Typinferenz nicht alle Typen ableiten. In WordPress sind weniger als 30 % der Typinformationen, die abgeleitet werden können, begrenzt, und der Verzweigungscode, der reduziert werden kann, ist begrenzt. Infolgedessen wird nach JIT direkt Maschinencode generiert und die generierten ByteCodes sind zu groß, was schließlich zu einem erheblichen Rückgang der CPU-Cache-Treffer (CPU-Cache-Miss) führt.

CPU-Cache-Treffer bedeutet, dass während des Lese- und Ausführungsprozesses der CPU die erforderlichen Daten nicht im Cache der ersten Ebene (L1) gelesen werden können, die Suche nach unten bis zur zweiten Ebene fortgesetzt werden muss Zwischen dem Cache (L2) und dem Cache der dritten Ebene (L3) wird schließlich versucht, die erforderlichen Befehlsdaten im Speicherbereich zu finden, und die Lesezeitdifferenz zwischen dem Speicher und dem CPU-Cache kann das 100-fache erreichen. Wenn daher die ByteCodes zu groß sind und die Anzahl der ausgeführten Anweisungen zu groß ist, kann der mehrstufige Cache nicht so viele Daten aufnehmen und einige Anweisungen müssen im Speicherbereich gespeichert werden.

Die Größe der Caches auf allen Ebenen der CPU ist ebenfalls begrenzt. Das folgende Bild zeigt die Konfigurationsinformationen des Intel i7 920:

Daher die Verringerung der CPU Die Cache-Trefferrate führt zu ernsthaften Problemen. Die zeitaufwändige Erhöhung wird andererseits auch durch die durch JIT erzielte Leistungsverbesserung ausgeglichen.

Durch JIT kann der Overhead von VM reduziert werden. Gleichzeitig kann durch die Befehlsoptimierung die Entwicklung der Speicherverwaltung indirekt reduziert werden, da die Anzahl der Speicherzuweisungen reduziert werden kann. Allerdings werden bei echten WordPress-Projekten nur 25 % der CPU-Zeit für die VM aufgewendet, und das Hauptproblem und der Hauptengpass liegt nicht wirklich auf der VM. Daher war der JIT-Optimierungsplan nicht in den PHP7-Funktionen dieser Version enthalten. Es ist jedoch wahrscheinlich, dass es in einer späteren Version implementiert wird, worauf es sich zu freuen lohnt.

(2) Der Verbesserungseffekt der JIT-Leistung hängt vom tatsächlichen Engpass des Projekts ab

JIT hat sich im Benchmark erheblich verbessert, da die Codemenge relativ gering ist, die endgültig generierten ByteCodes ebenfalls relativ gering sind und der Hauptaufwand in der VM liegt. Im eigentlichen WordPress-Projekt gibt es jedoch keine offensichtliche Leistungsverbesserung, da das Codevolumen von WordPress viel größer ist als das des Benchmarks. Obwohl JIT den Overhead der VM reduziert, führt es zu einer Verringerung der CPU-Cache-Treffer und zu zusätzlichem Speicher ByteCodes sind zu groß. Der Overhead führt letztendlich zu keiner Verbesserung.
Verschiedene Arten von Projekten haben unterschiedliche CPU-Overhead-Verhältnisse und erhalten unterschiedliche Ergebnisse. Leistungstests ohne tatsächliche Projekte sind nicht sehr repräsentativ.

2. Änderungen in Zval

Tatsächlich ist Zval der eigentliche Speicherträger verschiedener Arten von Variablen, der sich durch seine Toleranz und Toleranz auszeichnet. Im Wesentlichen handelt es sich um eine Struktur (Struktur), die in der C-Sprache implementiert ist. Für Studenten, die PHP schreiben, können Sie es grob als etwas Ähnliches wie ein Array verstehen.
Zval von PHP5, der Speicher belegt 24 Bytes (Screenshot von PPT):

Zval von PHP7, der Speicher belegt 16 Bytes (Screenshot von PPT):

Zval Von 24 Byte auf 16 Byte gesunken. Warum ist es gesunken? Hier müssen wir ein paar Grundlagen der C-Sprache hinzufügen, um Schülern, die mit C nicht vertraut sind, das Verständnis zu erleichtern. Es gibt einen kleinen Unterschied zwischen Struktur und Union (Union). Jede Mitgliedsvariable von Struct belegt einen unabhängigen Speicherplatz, während sich die Mitgliedsvariablen in Union einen Speicherplatz teilen (d. h. wenn eine der Mitgliedsvariablen geändert wird). Der öffentliche Raum wird sein. Nach der Änderung werden keine Datensätze anderer Mitgliedsvariablen vorhanden sein. Obwohl es scheinbar viel mehr Mitgliedsvariablen gibt, hat sich der tatsächlich belegte Speicherplatz verringert.

Darüber hinaus gibt es offensichtlich geänderte Funktionen, einige einfache Typen verwenden keine Referenzen mehr.

Zval-Strukturdiagramm (aus PPT):

Zval im Bild besteht aus zwei 64 Bits (1 Byte = 8 Bit, Bit ist „Bit“). Wenn die Variable der Typ ist lang oder bealoon ist und die Länge 64 Bit nicht überschreitet, wird er direkt im Wert gespeichert und es gibt keine folgende Referenz. Wenn es sich bei dem Variablentyp um ein Array, ein Objekt, eine Zeichenfolge usw. mit mehr als 64 Bit handelt, ist der gespeicherte Wert ein Zeiger, der auf die tatsächliche Speicherstrukturadresse zeigt.

Für einfache Variablentypen wird die Zval-Speicherung sehr einfach und effizient.

Typen, die keine Referenzen erfordern: NULL, Boolean, Long, Double
Typen, die Referenzen erfordern: String, Array, Objekt, Ressource, Referenz

3. Interner Typ zend_string

Zend_string ist eine Struktur, die tatsächlich Zeichenfolgen speichert. Der eigentliche Inhalt wird in val (char, Zeichentyp) gespeichert, und val ist ein char-Array mit einer Länge von 1 (praktisch für die Belegung mit Mitgliedsvariablen).

Die letzte Mitgliedsvariable der Struktur verwendet ein char-Array anstelle von char*. Hier ist ein kleiner Optimierungstrick, der CPU-Cache-Fehler reduzieren kann.
Wenn Sie ein char-Array verwenden und malloc den Speicher der obigen Struktur anwendet, wird es im selben Bereich angewendet. Normalerweise beträgt die Länge sizeof(_zend_string) + der tatsächliche char-Speicherplatz. Wenn Sie jedoch char* verwenden, ist das, was an dieser Stelle gespeichert wird, nur ein Zeiger, und die tatsächliche Speicherung erfolgt in einem anderen unabhängigen Speicherbereich.

Vergleich der Speicherzuweisung mit char[1] und char*:

Aus Sicht der Logikimplementierung gibt es eigentlich keinen großen Unterschied zwischen den beiden und die Auswirkungen sind sehr groß ähnlich. Wenn diese Speicherblöcke in die CPU geladen werden, sehen sie tatsächlich ganz anders aus. Da es sich bei Ersterem um denselben Speicher handelt, der kontinuierlich gemeinsam zugewiesen wird, kann er normalerweise zusammen abgerufen werden, wenn die CPU ihn liest (da er sich im Cache derselben Ebene befindet). Letzteres enthält Daten aus zwei Speichern. Wenn die CPU den ersten Speicher liest, ist es sehr wahrscheinlich, dass sich die Daten des zweiten Speichers nicht im Cache derselben Ebene befinden, sodass die CPU unterhalb von L2 (sekundärer Cache) suchen muss even to Das gewünschte zweite Stück Speicherdaten wird im Speicherbereich gefunden. Dies führt zu einem CPU-Cache-Fehler und der zeitaufwändige Unterschied zwischen beiden kann bis zu 100 Mal betragen.

Darüber hinaus kann zend_string beim Kopieren von Zeichenfolgen mithilfe der Referenzzuweisung Speicherkopien vermeiden.

6. Änderungen in PHP-Arrays (HashTable und Zend Array)

Beim Schreiben von PHP-Programmen sind Arrays der am häufigsten verwendete Typ, und PHP5-Arrays werden mithilfe von HashTable implementiert. Um es grob zusammenzufassen: Es handelt sich um eine HashTable, die doppelt verknüpfte Listen unterstützt. Sie unterstützt nicht nur die Hash-Zuordnung für den Zugriff auf Elemente über Array-Schlüssel, sondern kann auch Array-Elemente durchlaufen, indem sie über foreach auf doppelt verknüpfte Listen zugreift.
PHP5 HashTable (Screenshot von PPT):

Dieses Bild sieht sehr kompliziert aus, da verschiedene Zeiger herumspringen. Wenn wir über den Schlüsselwert auf den Inhalt eines Elements zugreifen, sind manchmal drei Zeiger erforderlich springt, um den richtigen Inhalt zu finden. Der wichtigste Punkt ist, dass die Speicherung dieser Array-Elemente auf verschiedene Speicherbereiche verteilt ist. Auf die gleiche Weise muss die CPU beim Lesen durch die CPU im Cache auf niedrigerer Ebene oder sogar im Speicherbereich suchen, da sie sich wahrscheinlich nicht im Cache auf derselben Ebene befinden, was dazu führt, dass der CPU-Cache-Treffer abnimmt Erhöhung des Verbrauchs.

Zend Array von PHP7 (Screenshot von PPT):

Die neue Version der Array-Struktur ist sehr einfach und auffällig. Das größte Merkmal besteht darin, dass die gesamten Array-Elemente und die Hash-Zuordnungstabelle alle miteinander verbunden und im selben Speicher zugeordnet sind. Wenn Sie ein Array einfacher Ganzzahltypen durchlaufen, ist die Effizienz sehr schnell, da die Array-Elemente (Bucket) selbst kontinuierlich im selben Speicher zugewiesen werden und der Zval der Array-Elemente die ganzzahligen Elemente intern speichert nicht Es gibt auch einen externen Zeigerlink und alle Daten werden im aktuellen Speicherbereich gespeichert. Das Wichtigste ist natürlich, dass CPU-Cache-Miss vermieden werden können (Abnahme der CPU-Cache-Trefferrate).

Änderungen des Zend-Arrays:
(1) Der Wert des Arrays ist standardmäßig zval.
(2) Die Größe von HashTable wird von 72 auf 56 Byte reduziert, was einer Reduzierung um 22 % entspricht.
(3) Die Bucket-Größe wurde von 72 auf 32 Byte verringert, was einer Reduzierung um 50 % entspricht.
(4) Der Speicherplatz der Buckets von Array-Elementen wird gemeinsam zugewiesen.
(5) Der Schlüssel des Array-Elements (Bucket.key) zeigt auf zend_string.
(6) Der Wert des Array-Elements wird in den Bucket eingebettet.
(7) CPU-Cache-Fehler reduzieren.

7. Funktionsaufrufkonvention (Funktionsaufrufkonvention)

PHP7 verbessert den Funktionsaufrufmechanismus durch die Optimierung des Parameterübertragungsprozesses, reduziert einige Anweisungen und verbessert die Ausführungseffizienz.

Funktionsaufrufmechanismus von PHP5 (Screenshot von PPT):

Im Bild sind die Anweisungen send_val und recv-Parameter im VM-Stack gleich. PHP7 reduziert diese beiden Elemente um die zugrunde liegende Optimierung des Funktionsaufrufmechanismus zu erreichen.

Funktionsaufrufmechanismus von PHP7 (Screenshot von PPT):

8 Lassen Sie den Compiler einen Teil der Arbeit im Voraus durch Makrodefinitionen und Inline-Funktionen (Inline) erledigen

Die Makrodefinition in C-Sprache wird in der Vorverarbeitungsphase (Kompilierungsphase) ausgeführt, ein Teil der Arbeit ist im Voraus abgeschlossen und es ist nicht erforderlich, Speicher zuzuweisen, wenn das Programm ausgeführt wird -ähnliche Funktionen ohne den Druck von Funktionsaufrufen. Der Aufwand für das Stapeln und Öffnen des Stapels ist relativ hoch. Das Gleiche gilt für Inline-Funktionen. In der Vorverarbeitungsphase werden die Funktionen im Programm durch Funktionskörper ersetzt. Wenn das tatsächlich laufende Programm hier ausgeführt wird, entsteht kein Overhead durch Funktionsaufrufe.

PHP7 hat in diesem Bereich viele Optimierungen vorgenommen und viel Arbeit, die in der laufenden Phase erledigt werden muss, in die Kompilierungsphase gesteckt. Beispielsweise kann die Parametertypbeurteilung (Parameteranalyse) in der Kompilierungsphase abgeschlossen werden, da es sich bei allen Beteiligten um feste Zeichenkonstanten handelt, wodurch die spätere Ausführungseffizienz verbessert wird.

Zum Beispiel wird die Art und Weise, mit der Art der übergebenen Parameter umzugehen, von der Schreibmethode auf der linken Seite zur Makro-Schreibmethode auf der rechten Seite optimiert.

3. Zusammenfassung

Niao Ges PPT hat eine Reihe von Vergleichsdaten veröffentlicht, das heißt, WordPress generiert 7 Milliarden CPU-Befehlsausführungen, wenn es in PHP5.6 100 Mal ausgeführt wird, während es in PHP7 nur 2,5 ist Milliarden benötigt wurden, eine Reduzierung um 64,2 %. Das sind schockierende Zahlen.

Im gesamten Austausch von Bruder Niao ist für mich der tiefgreifendste Standpunkt: Achten Sie auf Details, viele kleine Optimierungen und sammeln Sie sich Stück für Stück weiter an. Das Kleine summiert sich zum Großen und konvergiert schließlich erstaunliche Ergebnisse. Es ist unmöglich, mit neun Leuten an einem Tag einen Berg zu bauen. Ich denke, das ist wahrscheinlich der Grund.

Es besteht kein Zweifel, dass PHP7 sprunghafte Leistungssteigerungen erzielt hat. Wenn diese Ergebnisse auf das Websystem von PHP übertragen werden können, benötigen wir möglicherweise nur weniger Maschinen, um ein höheres Anforderungsvolumen zu unterstützen. Die Veröffentlichung der offiziellen Version von PHP7 ist voller endloser Erwartungen.

Empfohlenes Tutorial: „PHP-Video-Tutorial

Das obige ist der detaillierte Inhalt vonLernen Sie die Innovation und Leistungsoptimierung von PHP7 kennen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen