Heim >Backend-Entwicklung >PHP7 >Detaillierte Erklärung der neuen Funktionen von PHP7. Was in PHP 7 enthalten sein wird

Detaillierte Erklärung der neuen Funktionen von PHP7. Was in PHP 7 enthalten sein wird

coldplay.xixi
coldplay.xixinach vorne
2021-04-08 11:07:371661Durchsuche

Detaillierte Erklärung der neuen Funktionen von PHP7. Was in PHP 7 enthalten sein wird

PHP7 wird im Dezember 2015 offiziell veröffentlicht. PHP7 wird ein großes Versionsupdate der PHP-Skriptsprache sein, das auch erhebliche Leistungsverbesserungen und neue Funktionen sowie einige Verbesserungen mit sich bringen wird. Veraltete Funktionalität. Diese Version konzentriert sich auf Leistungsverbesserungen und stammt aus dem PHPNG-Zweig im PHP-Versionsbaum. Auf der ZendCon-Konferenz des Silicon Valley-Unternehmens diskutierte der PHP-Tool-Hersteller Zend Technologies offiziell die Fortschritte von PHPNG und PHP7. „(Dieses Upgrade) ist wirklich darauf ausgerichtet, der Branche dabei zu helfen, die Ausführungsgeschwindigkeit von Anwendungen erheblich zu steigern, gepaart mit den anderen Verbesserungen, die wir in PHP vorgenommen haben“, sagte Andy Termans, CEO von Zend, der an der Entwicklung der PHP-Sprache beteiligt war und Entwicklung) zum Ausdruck gebracht.

Empfohlen (kostenlos): PHP7

Werfen wir einen Blick auf die PHP7-Engine und die Funktionen auf der offiziellen Website:

PHP7-Engine ( Was wird in PHP 7 enthalten sein? / PHPNG)

  • Leistungsverbesserungen durch die Hinzufügung der PHPNG-Engine (Verwenden Sie die PHPNG-Engine, um die Leistung zu verbessern)
  • JIT – Just-in-Time-Compiler Abstrakter Syntaxbaum für die Kompilierung (Abstrakter Syntaxbaum-Kompilierung )
  • Asynchrones Refactoring der I/O-Schicht. Asynchrones Refactoring der I/O-Schicht.
    Multithread-Build im Webserver
  • Multithread-Build-WebserverErweiterte Verwendung der Operatoren ->, [], (), {} und :: Erweiterte Verwendung von ->, [ ], (), {} und :: Symbole
  • 100 % Leistungssteigerung
  • Leistung um 100 % gesteigert (sollte QPS sein)
  • Cooler Name: PHPNG Cooler Name: PHPNG-Engine
  • 1) PHP7 ist doppelt so schnell wie PHP5.6

    2) JIT – Just-in-Time-Compiler (Just-in-Time-Editor)

    Just In Time (Just-in-Time-Kompilierung) ist eine Softwareoptimierungstechnologie, die sich auf das Kompilieren von Bytecode für die Maschine bezieht im Laufzeitcode. 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 leistungsstarkes Tool ist Technologie, die Stein in Gold verwandelt.

    Tatsächlich haben Bruder Niao und Dmitry (einer der Kernentwickler der PHP-Sprache) 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.

    So wurden im Benchmark (Testprogramm) spannende Ergebnisse erzielt. Nach der Implementierung von JIT wurde die Leistung im Vergleich zu PHP5.5 um das Achtfache verbessert. 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.

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

                                                                                                

    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 % CPU-Zeit werden für integrierte Funktionen wie strlen aufgewendet.

    25 % 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)


    in PHP5 Da es im .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, um direkt ausführbaren Maschinencode zu generieren. 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 Prozesses des Lesens und Ausführens von Anweisungen durch die CPU die Suche nach unten bis zum Cache der zweiten Ebene fortgesetzt werden muss, wenn die erforderlichen Daten nicht im Cache der ersten Ebene (L1) gelesen werden können Der First-Level-Cache (L2) und der Third-Level-Cache (L3) versuchen schließlich, die erforderlichen Befehlsdaten im Speicherbereich zu finden, und der Lesezeitunterschied 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 ist die CPU-Cache-Trefferquote geringer wird einen erheblichen Zeitaufwand verursachen. Andererseits wird die durch JIT erzielte Leistungsverbesserung auch dadurch 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 wurde im Benchmark erheblich verbessert, da die Codemenge relativ gering ist und die endgültig generierten ByteCodes ebenfalls relativ gering sind Gleichzeitig ist der Hauptaufwand in der VM. 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ß, letztendlich gibt es keine Verbesserung.

    Verschiedene Arten von Projekten haben unterschiedliche CPU-Overhead-Verhältnisse und erzielen auch unterschiedliche Ergebnisse. Leistungstests ohne tatsächliche Projekte sind nicht sehr repräsentativ.


    3). Zvals Veränderungen


    Tatsächlich ist Zval der eigentliche Speicherträger verschiedener Arten von Variablen in PHP, der sich durch seine Toleranz und Toleranz auszeichnet. Im Wesentlichen handelt es sich um eine in der C-Sprache implementierte Struktur (Struktur). Für Studenten, die PHP schreiben, können Sie es grob als etwas verstehen, das einem Array-Array ähnelt.

    PHP5s Zval, der Speicher belegt 24 Bytes:



    PHP7s Zval, der Speicher belegt 16 Bytes:


    Zval sank von 24 Bytes auf. 16 Wörter Abschnitt, warum ist er rückläufig? Hier müssen wir ein wenig C-Sprachgrundlage 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 auch geänderte Funktionen, einige einfache Typen verwenden keine Referenzen mehr.

    Zval-Strukturdiagramm:


    Zval im Bild besteht aus 2 64 Bit (1 Byte = 8 Bit, Bit ist „Bit“), wenn der Variablentyp lang oder bealoon ist und die Länge 64 Bit nicht überschreitet direkt Beim Speichern im Wert gibt es keine folgenden Referenzen. 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, Object, Resource, Reference


    4) Interner Typ zend_string


    Zend_string Es handelt sich um 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 den Cache-Fehler der CPU 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) + tatsächlicher char-Speicherplatz. Wenn Sie jedoch char* verwenden, ist das, was an dieser Stelle gespeichert wird, nur ein Zeiger, und die eigentliche Speicherung erfolgt in einem anderen unabhängigen Speicherbereich.


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



    Aus Sicht der Logikimplementierung gibt es eigentlich keinen großen Unterschied zwischen den beiden und die Auswirkungen sind sehr ä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. 5). 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.


    HashTable für PHP5:



    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 Zeigersprünge erforderlich, 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 für 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 ist in den Bucket eingebettet.

    (7) CPU-Cache-Fehler reduzieren.


    6). Funktionsaufrufkonvention


    PHP7 verbessert den Funktionsaufrufprozess, reduziert einige Anweisungen und verbessert die Ausführungseffizienz.

    Funktionsaufrufmechanismus von PHP5 (Screenshot von PPT):



    In der Abbildung sind die Parameter send_val und recv im VM-Stack identisch. PHP7 erreicht die zugrunde liegende Optimierung des Funktionsaufrufmechanismus durch Reduzierung dieser beiden Duplikate.


    Funktionsaufrufmechanismus von PHP7 (Screenshot von PPT):



    7). Durch Makrodefinitionen und Inline-Funktionen (Inline) kann der Compiler einen Teil der Arbeit im Voraus abschließen


    C-Sprachmakrodefinitionen werden in der Vorverarbeitungsphase (Kompilierungsphase) ausgeführt, wodurch ein Teil der Arbeit im Voraus abgeschlossen wird, ohne dass Speicher zugewiesen wird, wenn das Programm ausgeführt wird. Es können funktionsähnliche Funktionen ohne den Stack-Push- und Pop-Overhead von Funktionsaufrufen erreicht werden . , die Effizienz wird höher sein. 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.


    In der folgenden Abbildung wird beispielsweise die Art und Weise der Übergabe von Parametertypen von der Schreibmethode links zur Makroschreibmethode rechts optimiert.

    PHP 7.0.0 RC 2 hat neue Funktionen veröffentlicht

    • Verbesserte Leistung: PHP 7 ist bis zu doppelt so schnell wie PHP 5.6: Die Leistung ist doppelt so hoch wie die von PHP5.6
    • Konsistente 64-Bit-Unterstützung unterstützt 64-Bit , Vereinheitlichen Sie die Ganzzahllänge auf verschiedenen Plattformen, und sowohl das Hochladen von Zeichenfolgen als auch von Dateien unterstützt mehr als 2 GB.
    • Viele schwerwiegende Fehler sind jetzt Ausnahmen. Mehr Fehler können mit Ausnahmen behandelt werden Vergleichsbetreiber (& lt;
    • Spezifische Beispiele:
    • Mehr Fehler werden zu abfangbaren Ausnahmen
    • PHP7 implementiert eine globale Schnittstelle, die ursprüngliche Ausnahme und einige Fehler implementieren alle diese Schnittstelle und die. Vererbung Struktur von Ausnahmen werden in Form von Schnittstellen definiert. 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 abfangbaren Fehlern handelt es sich in der Regel um Fehler, die dem Programm keinen schwerwiegenden Schaden zufügen, beispielsweise eine nicht vorhandene Funktion. 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 im Bild unten gezeigt


    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, wodurch einige Hackcodes reduziert werden können. Gleichzeitig soll die Implementierung leichter verständlich und wartungsfreundlich gestaltet werden.

    PHP5:


    PHP7:

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

    Native TLS (Native Thread local Speicher, nativer Thread-lokaler Speicher)

    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 den Speicher gemeinsam nutzen Raum des Prozesses, daher muss jeder Thread selbst auf irgendeine Weise einen privaten Raum aufbauen, 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.

    Und dieser eindeutige Schlüsselwert muss an jede Funktion übergeben werden, die globale Variablen in PHP5 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


    Kombinierter Vergleichsoperator (<=>) Kombinierter Vergleichsoperator (<=>)

    // PHP 7之前的写法:比较两个数的大小
    function order_func($a, $b) {
        return ($a < $b) ? -1 : (($a > $b) ? 1 : 0);
    }
    // PHP新增的操作符 <=>,perfect
    function order_func($a, $b) {
        return $a <=> $b;
    }

    Rückgabetypdeklarationen Rückgabetypdeklarationen und Skalartypdeklarationen

    Ein sehr wichtiges Merkmal der PHP-Sprache ist die „schwache Typisierung“, die das Schreiben von PHP-Programmen sehr einfach macht, und Anfänger, die mit PHP in Kontakt kommen, können es bekommen begann schnell, ist jedoch 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 Additionsfunktion plus eine Typdefinition kann beispielsweise so geschrieben werden:



    Wenn Sie mit dem obligatorischen Typwechselbefehl kooperieren, kann es so aussehen:



    Wenn strict_type nicht aktiviert ist, wird PHP versuchen, Ihnen bei der Konvertierung in zu helfen Erforderlicher Typ, und nach dem Einschalten ändert sich PHP und führt keine Typkonvertierung mehr durch, und es wird ein Fehler ausgegeben, wenn der Typ nicht übereinstimmt. Das sind großartige Neuigkeiten für Schüler, die „stark typisierte“ Sprachen mögen.

    Detailliertere Einführung: https://wiki.php.net/rfc/scalar_type_hints_v5 PHP7-Skalartypdeklaration RFC

    Warum direkt von PHP5.6 auf PHP7 springen (Angegebene Gründe, warum wir brauchen um zu PHP 7 zu springen)

    Es gibt mehrere Gründe, warum wir Version 6 nicht für die nächste Hauptversion von PHP wiederverwenden sollten.

    • In erster Linie gab es PHP 6 bereits und es war etwas völlig anderes. Das Dezimalsystem (oder genauer gesagt der unendliche Vorrat an Zahlen, den wir haben) macht es uns leicht, eine Version zu überspringen, und es bleibt noch viel mehr für zukünftige Versionen übrig.
    • Es stimmt zwar, dass das andere PHP 6 nie die allgemeine Verfügbarkeit erreicht hat, Es handelte sich immer noch um ein sehr weit verbreitetes und bekanntes Projekt von php.net, das absolut nichts mit der derzeit diskutierten Version zu tun hat. Jeder, der wusste, was PHP 6 ist (und davon gibt es viele), wird eine starke falsche Vorstellung von den Inhalten und Funktionen dieser neuen, kommenden Version haben (im Wesentlichen, dass es nur um Unicode geht).
    • PHP 6, das Original PHP 6, wurde auf vielen PHP-Konferenzen ausführlich besprochen. Es wurde den Benutzern als Selbstverständlichkeit beigebracht, einschließlich ausführlicher Erklärungen zu Funktionen und Verhalten (von PHP.net-Entwicklern, nicht von „bösen“ Buchautoren).
    • PHP 6 war nicht nur innerhalb der Internals-Community, sondern rund um die Uhr weithin bekannt PHP-Community im Allgemeinen. Es war ein hochkarätiges Projekt, von dem viele – wenn nicht die meisten – PHP-Community-Mitglieder wussten.
    • Es gibt viele Informationen zu PHP 6 über das ursprüngliche PHP 6 im Internet. Bücher sind der kleinste Teil des Problems.
    • Im Gegensatz zur „Trivia-Frage“ „Warum sind wir in 7 gesprungen?“ wird die Wiederverwendung von Version 6 wahrscheinlich echte Verwirrung in den Köpfen der Menschen hervorrufen, mit reichlich Informationen zu zwei völlig unterschiedlichen Versionen mit völlig unterschiedlichen Funktionssätzen, die genau den gleichen Namen haben.
    • Das Überspringen von Versionen ist sowohl bei Open-Source-Projekten als auch bei kommerziellen Produkten weder beispiellos noch ungewöhnlich. MariaDB ist ganz auf Version 10.0 gesprungen, um Verwirrung zu vermeiden, Netscape Communicator hat Version 5.0 direkt in 6.0 übersprungen und Symantec hat Version 13 übersprungen. Jeder einzelne von ihnen hatte unterschiedliche Gründe für das Überspringen, aber der gemeinsame Nenner ist das Überspringen von Versionen ist kaum eine große Sache.
    • Version 6 wird in der Welt der dynamischen Sprachen im Allgemeinen mit einem Scheitern in Verbindung gebracht. PHP 6 war ein Fehlschlag; Perl 6 war ein Fehlschlag. Es wird tatsächlich auch außerhalb der dynamischen Sprachwelt mit Misserfolgen in Verbindung gebracht – MySQL 6 existierte auch, wurde aber nie veröffentlicht. Die Wahrnehmung von Version 6 als Misserfolg – ​​nicht als Aberglaube, sondern als reale Tatsache (ähnlich der Assoziation des Wortes „Vista“ mit Misserfolg) – wird sich negativ auf diese PHP-Version auswirken.
    • Dies gilt größtenteils für Version 6 Dies ist eine Widerlegung einiger der oben genannten Punkte, ohne jedoch ein überzeugendes Argument dafür zu liefern, warum wir Version 6 *nicht* überspringen sollten. Wenn wir uns für PHP 7 entscheiden, besteht das schlimmste Szenario darin, dass wir eine Version unnötig übersprungen haben. Wir hätten immer noch einen unbegrenzten Vorrat an Hauptversionen für die zukünftige Verwendung zur Verfügung. Wenn wir jedoch 6 statt 7 wählen, kommt es im schlimmsten Fall zu weitverbreiteter Verwirrung in unserer Community und möglicherweise zu einer negativen Wahrnehmung dieser Version

    Apache (FastCGI und FPM könnten deutlich schneller sein, wenn mod_php als PIC erstellt wird)

    • Apache2handler

    • Unterstützt. Erweiterungen

    • bcmath

    • bz2

    • Kalender

    com_dotnet

  • ctype

  • curl

  • date

  • dba

  • dom

  • enchant

  • e reg

  • exif

  • Dateiinfo

  • Filter

  • ftp

  • gd

  • gettext

  • gmp

  • hash

  • iconv

  • imap

  • intl

  • json

  • ldap

  • libxml

  • mbstring

  • mcrypt

  • mysql

  • mysqli

  • mysqlnd

  • odbc (getestet mit unixODBC und MySQL-Treiber)

  • openssl

  • OPcache

  • pcntl

  • pcre

  • PDO

  • pdo_firebird

  • pdo_mysql

  • PDO_ODBC (getestet mit unixODBC und MySQL-Treiber)

  • pdo_pgsql

  • pdo_sqlite

  • pgsql

  • Phar

  • posix

  • pspell

  • readline

  • recode

  • Reflection

  • session

  • shmop

  • SimpleXML

  • snmp

  • soap

  • sockets

  • SPL

  • sqlite3

  • standard

  • sysvmsg

  • sysvsem

  • sysvshm

  • tidy

  • .
  • tokenizer

  • wddx

  • xml

  • xmlreader

  • xmlwriter

  • xsl

  • zip

  • zlib

  • Nicht unterstützte Erweiterungen (noch nicht)

    • interbase

    • mssql

    • oci8

    • pdo_dblib

    • pdo_oci

    • sybase_ct

    Ein paar Tipps, damit PHP 7 die höchste Leistung erreicht

    PHP7 VS PHP5.6


    1. Opcache


    Denken Sie daran, Zend Opcache zu aktivieren, da PHP7 schneller als PHP-5.6 ist, auch wenn Opcache nicht aktiviert ist. Daher kam es im vorherigen Testzeitraum vor, dass jemand es nie aktiviert hat es. Opcache-Sache. Das Aktivieren von Opcache ist sehr einfach. Fügen Sie einfach die Konfigurationsdatei php.ini hinzu:


    zend_extension=opcache.so

    opcache.enable=1

    opcache.enable_cli=1"


    2. Verwenden Sie einen neuen Compiler


    Verwenden Sie einen neueren Compiler. GCC 4.8 oder höher wird empfohlen, da nur GCC 4.8 oder höher PHP Global Register für Opline- und Execute_Data-Unterstützung aktiviert. Dies bringt Leistung Verbesserung von etwa 5 % (gemessen aus der QPS-Perspektive von Wordpres)


    Tatsächlich wird es auch von Versionen vor GCC 4.8 unterstützt, aber wir haben festgestellt, dass es Fehler in der Unterstützung gibt, daher muss es Version 4.8 oder sein oben, um diese Funktion zu aktivieren.


    3.


    Am Beispiel meines CentOS 6.5 übergeben Sie:


    $sudo sysctl vm.nr_hugepages=512


    .

    Weisen Sie 512 reservierte große Seiten zu. Speicher:


    $ cat /proc/meminfo |

    HugePages_Total: 512

    HugePages_Free: 504

    HugePages_Rsvd: 27

    HugePages_Surp: 0

    Riesige Seitengröße: 2048 kB


    Dann fügen Sie es in PHP hinzu. ini:


    opcache.huge_code_pages=1


    Auf diese Weise verwendet PHP große Speicherseiten, um sein eigenes Textsegment und die große Speicherzuweisung zu speichern, wodurch TLB reduziert wird verpassen, wodurch die Leistung verbessert wird.


    4. Opcache-Dateicache aktivieren (experimentell), indem wir Opcache den Opcode-Cache in einer externen Datei zwischenspeichern lassen Es gibt eine deutliche Leistungsverbesserung.

    In php.ini hinzufügen:

    opcache.file_cache=/tmp


    Auf diese Weise speichert PHP einige Opcode-Binärexportdateien im Verzeichnis /tmp über den gesamten PHP-Lebenszyklus hinweg.

    5, PGO 5, PGO , Drupal oder etwas anderes, dann können Sie versuchen, PGO zur Verbesserung von PHP zu verwenden, um gezielt die Leistung Ihres Projekts zu verbessern.


    Konkret wird WordPress 4.1 als Optimierungsszenario verwendet. Zunächst einmal beim Kompilieren von PHP:


    $ make prof-gen


    Dann trainieren Sie PHP mit Ihrem Projekt, zum Beispiel für WordPress:


    $ sapi/cgi/php-cgi -T 100 /home/huixinchen/local/www/htdocs/wordpress/index.php > ;/dev/null


    Das heißt, php-cgi 100 Mal auf der WordPress-Homepage ausführen zu lassen, um dabei einige Profilinformationen zu generieren.


    Endlich:


    $ make prof-clean

    $ make prof-use


    Das PHP7, das Sie zu diesem Zeitpunkt kompilieren, ist die kompilierte Version mit der höchsten Leistung, die auf Ihr Projekt zugeschnitten ist.


    Das ist alles für den Moment, ich werde später noch mehr hinzufügen, wenn ich darüber nachdenke, jeder ist herzlich willkommen, es auszuprobieren, danke.

    Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung der neuen Funktionen von PHP7. Was in PHP 7 enthalten sein wird. 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