Inhaltsverzeichnis
1. PHP-Designkonzept und Eigenschaften
2. Das vierschichtige System von PHP
3. Sapi
4. PHP-Ausführungsprozess und Opcode
6 >PHP ist eine schwach typisierte Sprache und unterscheidet die Variablentypen nicht streng. PHP muss beim Deklarieren von Variablen den Typ nicht angeben. PHP kann während der Programmausführung implizite Konvertierungen von Variablentypen durchführen. Wie bei anderen stark typisierten Sprachen kann auch eine explizite Typkonvertierung im Programm durchgeführt werden. PHP-Variablen können in einfache Typen (int, string, bool), Sammlungstypen (Array-Ressourcenobjekt) und Konstanten (const) unterteilt werden. Alle oben genannten Variablen haben unter der Haube die gleiche zval-Struktur.
Heim Backend-Entwicklung PHP-Tutorial Detaillierte Erläuterung des zugrunde liegenden Betriebsmechanismus von PHP

Detaillierte Erläuterung des zugrunde liegenden Betriebsmechanismus von PHP

Mar 21, 2018 pm 03:43 PM
php 详解 运行机制

In diesem Artikel geben wir Ihnen hauptsächlich eine detaillierte Erklärung des zugrunde liegenden Betriebsmechanismus von PHP. Zunächst werden wir Ihnen die Designkonzepte und Eigenschaften von PHP, das vierschichtige System von PHP usw. mitteilen es kann dir helfen.

1. PHP-Designkonzept und Eigenschaften

  1. Multiprozessmodell: Da es sich bei PHP um ein Multiprozessmodell handelt, stören sich verschiedene Anforderungen nicht gegenseitig, was gewährleistet Dass eine Anfrage hängen bleibt Der Verlust hat keine Auswirkungen auf den Gesamtdienst. Natürlich hat PHP mit der Entwicklung der Zeit bereits das Multithreading-Modell unterstützt.

  2. Schwach typisierte Sprache: Im Gegensatz zu C/C++, Java, C# und anderen Sprachen ist PHP eine schwach typisierte Sprache. Der Typ einer Variablen wird nicht zu Beginn bestimmt und es kann zu einer impliziten oder expliziten Typkonvertierung kommen. Die Flexibilität dieses Mechanismus ist in der Webentwicklung sehr praktisch sind detailliert in.

  3. Interpretierte Sprache: PHP unterscheidet sich von C/C++, Java, C# und anderen kompilierten Sprachen in den laufenden Schritten. PHP muss durch lexikalische und syntaktische Analyse in eine kompilierte Sprache umgewandelt werden Analyse zuerst, um zu laufen! Daher ist PHP nicht für umfangreiche Anwendungen wie Hochleistungs- oder Big-Data-Berechnungen geeignet. Obwohl es für Browserbenutzer keinen Unterschied zwischen 0,001 Sekunden und 0,1 Sekunden gibt, ist es für andere Bereiche nicht geeignet

  4. Das Modell Engine (Zend) + Komponente (ext) reduziert die interne Kopplung.

  5. Die mittlere Schicht (Sapi) isoliert den Webserver und PHP.

  6. Die Syntax ist einfach und flexibel, ohne zu viele Spezifikationen. Mängel führen zu gemischten Stilen, aber egal wie schlecht ein Programmierer ist, er wird kein Programm schreiben, das zu unverschämt ist und die Gesamtsituation gefährdet.

2. Das vierschichtige System von PHP

Die Kernarchitektur von PHP ist wie folgt:

Aus dem Bild ist ersichtlich, dass PHP von unten nach oben ein 4-Schichten-System ist:

  • Zend-Engine: Zend ist vollständig in reinem C implementiert und ist der Kernbestandteil von PHP. Es übersetzt PHP-Code (lexikalische Analyse, Syntaxanalyse und eine Reihe von Kompilierungsprozessen), um ausführbare Opcodes zu verarbeiten und entsprechende Verarbeitungsmethoden zu implementieren, grundlegende Datenstrukturen (wie Hashtable, oo), Speicherzuweisung und -verwaltung zu implementieren und entsprechende API-Methoden für externe bereitzustellen Es ist der Kern von allem und alle peripheren Funktionen sind rund um Zend implementiert.

  • Erweiterungen: Rund um die Zend-Engine stellen Erweiterungen verschiedene grundlegende Dienste über Komponenten bereit. Unsere gemeinsamen integrierten Funktionen (z. B. Array-Serien), Standardbibliotheken usw. werden alle über die Erweiterung übergeben Benutzer können bei Bedarf auch eigene Erweiterungen implementieren, um Funktionserweiterungen, Leistungsoptimierungen usw. zu erreichen. (Beispielsweise sind die PHP-Mittelschicht und die Rich-Text-Analyse, die derzeit von Tieba verwendet werden, typische Erweiterungsanwendungen).

  • Sapi: Der vollständige Name von Sapi ist Server Application Programming Interface. Dies ist die Server-Anwendungsprogrammierschnittstelle, die es PHP ermöglicht, über eine Reihe von Hook-Funktionen mit Peripheriedaten zu interagieren Sehr elegant für PHP. Durch die erfolgreiche Entkopplung und Isolierung von PHP selbst von der übergeordneten Anwendung kann PHP nicht mehr berücksichtigen, wie es mit verschiedenen Anwendungen kompatibel ist, und die Anwendung selbst kann entsprechend auch unterschiedliche Verarbeitungsmethoden implementieren zu seinen eigenen Eigenschaften.

  • Anwendung der oberen Ebene: Dies ist das PHP-Programm, das wir normalerweise schreiben. Wir können verschiedene Anwendungsmodi über verschiedene Sapi-Methoden erhalten, z. B. die Implementierung von Webanwendungen über einen Webserver und die Verwendung von „Run in script“. Modus usw.

Wenn PHP ein Auto ist, dann ist das Framework des Autos PHP selbst, Zend ist der Motor (Motor) des Autos und die verschiedenen Komponenten unter Ext sind die Räder des Sapi kann sehen, dass es sich um eine Straße handelt, und Autos können auf verschiedenen Straßentypen fahren, und die Ausführung eines PHP-Programms bedeutet, dass das Auto auf der Straße fährt. Deshalb brauchen wir: einen leistungsstarken Motor + die richtigen Räder + die richtige Spur.

3. Sapi

Wie oben erwähnt, ermöglicht Sapi externen Anwendungen den Austausch von Daten mit PHP über eine Reihe von Schnittstellen und die Implementierung spezifischer Verarbeitungsmethoden entsprechend unterschiedlicher Anwendungsmerkmale Sapis sind:

  • apache2handler: Dies ist die Verarbeitungsmethode, wenn Apache als Webserver verwendet wird und im mod_PHP-Modus ausgeführt wird. Sie ist derzeit auch die am weitesten verbreitete.

  • cgi: Dies ist eine weitere direkte Interaktionsmethode zwischen Webserver und PHP, das berühmte Fastcgi-Protokoll. In den letzten Jahren wurde fastcgi + PHP immer häufiger verwendet, und das wird auch der Fall sein asynchron. Die einzige vom Webserver unterstützte Methode.

  • cli: Anwendungsmodus für Befehlszeilenaufrufe

4. PHP-Ausführungsprozess und Opcode

Werfen wir zuerst einen Blick darauf Der Prozess, durch den PHP-Code ausgeführt wird.

Wie Sie auf dem Bild sehen können, implementiert PHP einen typischen dynamischen Sprachausführungsprozess: Nachdem ein Code erhalten wurde und Phasen wie die lexikalische Analyse und die Syntaxanalyse durchlaufen wurden, wird das Quellprogramm in Anweisungen (Opcodes) übersetzt. . Die virtuelle ZEND-Maschine führt diese Anweisungen dann nacheinander aus, um den Vorgang abzuschließen. PHP selbst ist in C implementiert, daher sind die letztendlich aufgerufenen Funktionen alle C-Funktionen. Tatsächlich können wir PHP als eine in C entwickelte Software betrachten.

Der Kern der PHP-Ausführung sind die übersetzten Anweisungen, bei denen es sich um Opcodes handelt.

Opcode ist die grundlegendste Einheit der PHP-Programmausführung. Ein Opcode besteht aus zwei Parametern (op1, op2), einem Rückgabewert und einer Verarbeitungsfunktion. Das PHP-Programm wird letztendlich in die sequentielle Ausführung einer Reihe von Opcode-Verarbeitungsfunktionen übersetzt.

Mehrere gängige Verarbeitungsfunktionen:

PHP

tr>

1

2

3

4

5

6

ZEND_ASSIGN_SPEC_CV_CV_HANDLER : 变量分配 ($a=$b)

ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER:函数调用

ZEND_CONCAT_SPEC_CV_CV_HANDLER:字符串拼接 $a.$b

ZEND_ADD_SPEC_CV_CONST_HANDLER: 加法运算 $a+2

ZEND_IS_EQUAL_SPEC_CV_CONST:判断相等 $a==1

ZEND_IS_IDENTICAL_SPEC_CV_CONST:判断相等 $a===1

123456
ZEND_ASSIGN_SPEC_CV_CV_HANDLER: Variablenzuordnung ($a=$b)ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER: FunktionsaufrufZEND_CONCAT_SPEC_CV_CV_HANDLER: String-Verkettung $a.$b<.>ZEND_ADD_SPEC_C V_CONST_HANDLER: Additionsoperation $a+2ZEND_IS_EQUAL_SPEC_CV_CONST: Gleich $a==1 beurteilenZEND_IS_IDENTICAL_SPEC_CV_CONST: Gleich $a===1 beurteilen


5. HashTable – Kerndatenstruktur

HashTable ist die Kerndatenstruktur von Zend. Es wird verwendet, um fast alle gängigen Funktionen in PHP zu implementieren. Darüber hinaus werden innerhalb von Zend auch Funktionssymboltabellen, globale Variablen usw. basierend auf Hash-Tabellen implementiert.

Die Hash-Tabelle von PHP weist die folgenden Eigenschaften auf:

  • Unterstützt typische Schlüssel->Wert-Abfragen

  • kann verwendet werden als Die Verwendung von

  • zum Hinzufügen und Löschen von Knoten in einem Array ist O(1)-Komplexität

  • key unterstützt gemischte Typen: Es gibt sowohl assoziative als auch kombinierte Arrays Indexarrays

  • Wert unterstützt gemischte Typen: Array ("string",2332)

  • unterstützt lineare Durchquerung: wie foreach

Die Zend-Hash-Tabelle implementiert die typische Hash-Tabellen-Hash-Struktur und bietet gleichzeitig die Funktion des Vorwärts- und Rückwärtsdurchlaufs des Arrays durch Anhängen einer doppelt verknüpften Liste. Seine Struktur ist wie folgt:

Wie Sie sehen können, gibt es in der Hash-Tabelle sowohl Hash-Strukturen in Form eines Schlüssel->Werts als auch eines doppelt verknüpften Listenmodus. Dadurch ist es sehr praktisch, unterstützt schnelle Suche und lineares Durchqueren.

  • Hash-Struktur: Die Hash-Struktur von Zend ist ein typisches Hash-Tabellenmodell, das eine verknüpfte Liste verwendet, um Konflikte zu lösen. Es ist zu beachten, dass die Hash-Tabelle von Zend eine selbstwachsende Datenstruktur ist. Wenn die Hash-Tabelle voll ist, wird sie dynamisch um das Zweifache erweitert und Elemente neu positioniert. Die Anfangsgröße beträgt 8. Darüber hinaus hat Zend selbst bei der Durchführung der schnellen Schlüssel->Wertsuche einige Optimierungen vorgenommen, um den Prozess durch den Austausch von Raum gegen Zeit zu beschleunigen. Beispielsweise wird in jedem Element eine Variable nKeyLength verwendet, um die Länge des Schlüssels zur schnellen Bestimmung zu identifizieren.

  • Doppelt verknüpfte Liste: Die Zend-Hash-Tabelle implementiert die lineare Durchquerung von Elementen durch eine verknüpfte Listenstruktur. Theoretisch reicht es aus, eine einseitig verknüpfte Liste zum Durchlaufen zu verwenden. Der Hauptzweck der Verwendung einer zweiseitig verknüpften Liste besteht darin, das Durchlaufen schnell zu löschen und zu vermeiden. Die Zend-Hash-Tabelle ist eine zusammengesetzte Struktur, die gängige assoziative Arrays unterstützt und auch als sequentielle Indexnummern verwendet werden kann und sogar eine Mischung aus beiden ermöglicht.

  • PHP-Assoziatives Array: Assoziatives Array ist eine typische hash_table-Anwendung. Ein Abfrageprozess durchläuft die folgenden Schritte (wie aus dem Code ersichtlich ist, handelt es sich hierbei um einen üblichen Hash-Abfrageprozess und es werden einige schnelle Beurteilungen hinzugefügt, um die Suche zu beschleunigen.):

PHP

1

2

3

4

5

6

7

8

9

10

getKeyHashValueh;

index=n&nTableMask;

Bucket*p=arBucket[index];

while(p){

if((p->h==h)&(p->nKeyLength==nKeyLength)){

RETURNp->data;  

}

p=p->next;

}

RETURNFALTURE;

1 23456789 10

  • PHP-Index-Array: Das Index-Array ist unser gemeinsames Array, auf das über Indizes zugegriffen wird. Beispiel: $arr[0], Zend HashTable wird intern normalisiert und der Hash-Wert und nKeyLength (0) werden auch dem Indextypschlüssel zugewiesen. Die interne Mitgliedsvariable nNextFreeElement ist die aktuell zugewiesene maximale ID, die nach jedem Push automatisch um eins erhöht wird. Es ist dieser Normalisierungsprozess, der es PHP ermöglicht, eine Mischung aus assoziativen und nicht-assoziativen Daten zu erreichen. Aufgrund der Besonderheit des Push-Vorgangs wird die Reihenfolge der Indexschlüssel im PHP-Array nicht durch die Größe des Index bestimmt, sondern durch die Reihenfolge des Pushs. Zum Beispiel $arr[1] = 2; $arr[2] = 3; Zend HashTable behandelt sie als Indexschlüssel

  • 6 >PHP ist eine schwach typisierte Sprache und unterscheidet die Variablentypen nicht streng. PHP muss beim Deklarieren von Variablen den Typ nicht angeben. PHP kann während der Programmausführung implizite Konvertierungen von Variablentypen durchführen. Wie bei anderen stark typisierten Sprachen kann auch eine explizite Typkonvertierung im Programm durchgeführt werden. PHP-Variablen können in einfache Typen (int, string, bool), Sammlungstypen (Array-Ressourcenobjekt) und Konstanten (const) unterteilt werden. Alle oben genannten Variablen haben unter der Haube die gleiche zval-Struktur.

    Zval ist eine weitere sehr wichtige Datenstruktur in Zend, die zum Identifizieren und Implementieren von PHP-Variablen verwendet wird. Die Datenstruktur ist wie folgt:

    Zval besteht hauptsächlich aus aus drei Teilen zusammengesetzt:

      Typ: Gibt den Typ der Variablen an (Ganzzahl, Zeichenfolge, Array usw.)
    • refcount&is_ref: verwendet zum Implementieren der Referenzzählung (detaillierte Einführung später)
    • Wert: Der Kernteil, der die tatsächlichen Daten der Variablen
    • Z-Wert speichert, wird verwendet um eine variable Ist-Daten zu speichern. Da mehrere Typen gespeichert werden müssen, ist zvalue eine Union und implementiert somit eine schwache Typisierung.

    Die entsprechende Beziehung zwischen PHP-Variablentypen und ihrem tatsächlichen Speicher ist wie folgt:

    PHP

    1

    1

    2

    3

    4

    5

    IS_LONG   -> lvalue

    IS_DOUBLE -> dvalue

    IS_ARRAY  -> ht

    IS_STRING -> str

    IS_RESOURCE -> lvalue

    245
    IS_LONG -> lvalueIS_DOUBLE -> dvalueIS_ARRAY -> htIS_STRING -> str IS_RESOURCE -> lvalue

    Referenzzählung wird häufig beim Speicherrecycling, bei String-Operationen usw. verwendet. Variablen in PHP sind eine typische Anwendung der Referenzzählung. Die Referenzzählung von Zval wird über die Mitgliedsvariablen is_ref und ref_count implementiert. Durch die Referenzzählung können mehrere Variablen dieselben Daten teilen. Vermeiden Sie den enormen Verbrauch, der durch häufiges Kopieren entsteht.

    Beim Ausführen einer Zuweisungsoperation verweist Zend die Variable auf denselben zval und ref_count++ und während der nicht gesetzten Operation auf den entsprechenden ref_count-1. Der Zerstörungsvorgang wird nur ausgeführt, wenn ref_count auf 0 reduziert wird. Wenn es sich um eine Referenzzuweisung handelt, ändert Zend is_ref auf 1.

    PHP-Variablen realisieren die gemeinsame Nutzung von Daten durch Referenzzählung. Was passiert, wenn Sie den Wert einer der Variablen ändern? Wenn Zend beim Versuch, eine Variable zu schreiben, feststellt, dass der ZVAL, auf den die Variable zeigt, von mehreren Variablen gemeinsam genutzt wird, kopiert es einen ZVAL mit einem Ref_Count von 1 und verringert den RefCount des ursprünglichen ZVAL. Dieser Vorgang wird als „ZVAL-Trennung“ bezeichnet ". Es ist ersichtlich, dass Zend nur dann Kopiervorgänge ausführt, wenn ein Schreibvorgang auftritt. Daher wird es auch als Copy-on-Write (Copy-on-Write) bezeichnet.

    Für Referenzvariablen sind die Anforderungen entgegengesetzt zu Nicht- Referenztypen. Referenzzuweisungsvariablen müssen gebündelt werden.

    Ganzzahlen und Gleitkommazahlen gehören zu den Grundtypen in PHP und sind auch einfache Variablen. Für Ganzzahlen und Gleitkommazahlen werden die entsprechenden Werte direkt in zvalue gespeichert. Ihre Typen sind lang bzw. doppelt.

    Wie aus der zvalue-Struktur ersichtlich ist, unterscheidet PHP im Gegensatz zu stark typisierten Sprachen wie c nicht zwischen int, unsigned int, long, long long und anderen Typen. Nur Ganzzahlen. Ein Typ ist lang. Daraus ist ersichtlich, dass in PHP der Wertebereich von Ganzzahlen durch die Anzahl der Compiler-Bits bestimmt wird und nicht festgelegt ist.

    Bei Gleitkommazahlen wird, ähnlich wie bei ganzen Zahlen, nicht zwischen Float und Double, sondern nur Double unterschieden.

    Was soll ich in PHP tun, wenn der Ganzzahlbereich außerhalb der Grenzen liegt? In diesem Fall wird es automatisch in den Double-Typ konvertiert. Sie müssen dabei vorsichtig sein, da dies zu vielen Tricks führt.

    Zeichenvariablen sind wie Ganzzahlen auch Grundtypen und einfache Variablen in PHP. Aus der zvalue-Struktur ist ersichtlich, dass in PHP ein String aus einem Zeiger auf die tatsächlichen Daten und einer Längenstruktur besteht, die dem String in C++ ähnelt. Da die Länge im Gegensatz zu c durch eine tatsächliche Variable dargestellt wird, kann es sich bei der Zeichenfolge um Binärdaten (einschließlich) handeln. Gleichzeitig ist das Ermitteln der Zeichenfolgenlänge strlen eine O(1)-Operation.

    Beim Hinzufügen, Ändern oder Anhängen von Zeichenfolgenoperationen weist PHP den Speicher neu zu, um neue Zeichenfolgen zu generieren. Schließlich fügt PHP aus Sicherheitsgründen am Ende beim Generieren einer Zeichenfolge immer noch

    hinzu. Gängige String-Splicing-Methoden und Geschwindigkeitsvergleich:

    Angenommen, es gibt die folgenden 4 Variablen: $strA= '. 123'; $strB = '456'; $intA=123;

    Jetzt vergleichen und erklären wir die folgenden String-Splicing-Methoden:

    PH

    1

    2

    3

    4

    5

    6

    7

    8

    $res=$strA.$strB和$res=“$strA$strB”

    这种情况下,zend会重新malloc一块内存并进行相应处理,其速度一般

    $strA=$strA.$strB

    这种是速度最快的,zend会在当前strA基础上直接relloc,避免重复拷贝

    $res=$intA.$intB

    这种速度较慢,因为需要做隐式的格式转换,实际编写程序中也应该注意尽量避免

    $strA=sprintf(“%s%s”,$strA.$strB);

    这会是最慢的一种方式,因为sprintf在PHP中并不是一个语言结构,本身对于格式识别和处理就需要耗费比较多时间,另外本身机制也是malloc。不过sprintf的方式最具可读性,实际中可以根据具体情况灵活选择。

    12 345678
    $res=$strA.$strB und $res=“$strA$strB“In diesem Fall mallociert Zend einen Teil des Speichers neu und verarbeitet ihn entsprechend, und die Geschwindigkeit ist durchschnittlich $strA=$strA.$strBDies ist die schnellste Methode. Zend wird direkt basierend auf dem aktuellen strA neu lokalisieren, um wiederholtes Kopieren zu vermeiden$res=$intA .$intBDies ist langsamer, da eine implizite Formatkonvertierung erforderlich ist. Bei der tatsächlichen Programmierung sollten Sie auch darauf achten, $strA=sprintf(“%s%s” ,$strA.$strB) zu vermeiden. ;Dies ist der langsamste Weg, da sprintf keine Sprachstruktur in PHP ist und es viel Zeit in Anspruch nimmt, das Format zu identifizieren und zu verarbeiten. Darüber hinaus ist es selbst Der Mechanismus ist auch malloc. Die Sprintf-Methode ist jedoch die am besten lesbare Methode und kann in der Praxis je nach den spezifischen Umständen flexibel ausgewählt werden.


    PHP-Arrays werden natürlich durch Zend HashTable implementiert.

    Wie implementiert man eine foreach-Operation? Foreach auf einem Array wird durch Durchlaufen der doppelt verknüpften Liste in der Hashtabelle vervollständigt. Bei Index-Arrays ist die Durchquerung von foreach viel effizienter als bei for, sodass keine Suche nach Schlüssel->Werten erforderlich ist. Die Zähloperation ruft direkt die Operation HashTable->NumOfElements, O(1) auf. Für eine Zeichenfolge wie „123“ konvertiert Zend sie in ihre Ganzzahlform. $arr[‘123’] und $arr[123] sind äquivalent

    Ressourcentypvariablen sind die komplexesten Variablen in PHP und stellen ebenfalls eine zusammengesetzte Struktur dar.

    Zval von PHP kann ein breites Spektrum an Datentypen darstellen, es ist jedoch schwierig, benutzerdefinierte Datentypen vollständig zu beschreiben. Da es keine effiziente Möglichkeit gibt, diese zusammengesetzten Strukturen darzustellen, gibt es keine Möglichkeit, herkömmliche Operatoren für sie zu verwenden. Um dieses Problem zu lösen, müssen Sie nur über einen im Wesentlichen willkürlichen Bezeichner (Label), der als Ressource bezeichnet wird, auf den Zeiger verweisen.

    In zval wird lval für Ressourcen als Zeiger verwendet, der direkt auf die Adresse der Ressource zeigt. Die Ressource kann eine beliebige zusammengesetzte Struktur sein. Die bekannten Ressourcen mysqli, fsock, memcached usw. sind allesamt Ressourcen.

    So verwenden Sie Ressourcen:

    • Registrierung: Sie möchten einen benutzerdefinierten Datentyp als Ressource verwenden. Zuerst müssen Sie es registrieren, und Zend weist ihm eine weltweit eindeutige Kennung zu.

    • Eine Ressourcenvariable abrufen: Für Ressourcen verwaltet Zend eine id->hash_tale der tatsächlichen Daten. Für eine Ressource wird nur ihre ID in zval aufgezeichnet. Suchen Sie beim Abrufen den spezifischen Wert in der hash_table über die ID und geben Sie ihn zurück.

    • Ressourcenzerstörung: Die Datentypen von Ressourcen sind vielfältig. Zend selbst hat keine Möglichkeit, es zu zerstören. Daher müssen Benutzer bei der Registrierung von Ressourcen eine Zerstörungsfunktion bereitstellen. Wenn Ressourcen nicht festgelegt sind, ruft Zend die entsprechende Funktion auf, um die Zerstörung abzuschließen. Löschen Sie es auch aus der globalen Ressourcentabelle.

    Eine Ressource kann lange bestehen bleiben, nicht nur nachdem alle Variablen, die auf sie verweisen, den Gültigkeitsbereich verlassen, sondern auch nachdem eine Anfrage endet und eine neue Anfrage generiert wird. Diese Ressourcen werden als persistente Ressourcen bezeichnet, da sie während des gesamten Lebenszyklus der SAPI bestehen bleiben, sofern sie nicht ausdrücklich zerstört werden. In vielen Fällen können persistente Ressourcen die Leistung bis zu einem gewissen Grad verbessern. In unserem gemeinsamen mysql_pconnect weisen persistente Ressourcen beispielsweise Speicher über pemalloc zu, sodass sie nicht freigegeben werden, wenn die Anforderung endet.
    Für Zend gibt es keinen Unterschied zwischen den beiden.

    Wie werden lokale Variablen und globale Variablen in PHP implementiert? Bei einer Anfrage kann PHP jederzeit zwei Symboltabellen (symbol_table und active_symbol_table) sehen, wobei erstere zur Verwaltung globaler Variablen verwendet wird. Letzteres ist ein Zeiger, der auf die aktuell aktive Variablensymboltabelle zeigt. Wenn das Programm eine Funktion aufruft, weist zend ihr eine Symboltabelle x zu und zeigt active_symbol_table auf a. Auf diese Weise wird die Unterscheidung zwischen globalen und lokalen Variablen erreicht.

    Variablenwerte abrufen: Die PHP-Symboltabelle wird über hash_table implementiert. Beim Abrufen wird der entsprechende zval entsprechend der Kennung ermittelt und zurückgegeben.

    Globale Variablen in Funktionen verwenden: In Funktionen können wir globale Variablen verwenden, indem wir sie explizit als global deklarieren. Erstellen Sie einen Verweis auf die Variable mit demselben Namen in symbol_table in active_symbol_table. Wenn in symbol_table keine Variable mit demselben Namen vorhanden ist, wird diese zuerst erstellt.

    Der Prozess des PHP-Ausführungsmechanismus:

    1 Wir haben den PHP-bezogenen Prozess nie manuell gestartet, er wird mit dem Start von Apache ausgeführt.

    2 an Apache über das Modul mod_php5.so (insbesondere SAPI, die Server-Anwendungsprogrammierschnittstelle); . Der PHP-Kernel wird zur Verarbeitung von Anfragen, Dateiströmen, Fehlerbehandlung und anderen damit verbundenen Vorgängen verwendet.

    5. Die Zend-Engine (ZE) wird verwendet, um Quelldateien in Maschinensprache zu konvertieren und dann auf der virtuellen Maschine auszuführen Es;

    6. Die Erweiterungsschicht ist eine Reihe von Funktionen, Bibliotheken und Streams, die PHP verwendet, um bestimmte Vorgänge auszuführen. Beispielsweise benötigen wir die MySQL-Erweiterung, um eine Verbindung zur MySQL-Datenbank herzustellen. Wenn ZE das Programm ausführt, muss es möglicherweise eine Verbindung zu mehreren Erweiterungen herstellen und geben Sie es nach der Verarbeitung der spezifischen Aufgabe zurück.

    8 Schließlich gibt ZE die Ergebnisse der Programmausführung an den PHP-Kernel zurück, der die Ergebnisse dann an die SAPI-Schicht überträgt und sie schließlich an den Browser ausgibt.

    Ausführliche Diskussion des PHP-Betriebsmechanismus

    Der erste Schritt des PHP-Starts des PHP-Betriebsmechanismus

    Sie sind sich nicht sicher, was der erste und der zweite Schritt sind? Machen Sie sich keine Sorgen, wir werden dies als Nächstes ausführlich besprechen.

    Werfen wir einen Blick auf den ersten und wichtigsten Schritt. Beachten Sie, dass der erste Schritt des Vorgangs erfolgt, bevor Anfragen eingehen. Nach dem Start von Apache startet auch der PHP-Interpreter; PHP ruft die MINIT-Methode jeder Erweiterung auf und versetzt diese Erweiterungen dadurch in einen verfügbaren Zustand. Schauen Sie sich an, welche Erweiterungen in der Datei php.ini geöffnet sind. MINIT bedeutet „Modulinitialisierung“. Jedes Modul definiert eine Reihe von Funktionen, Klassenbibliotheken usw. zur Bearbeitung anderer Anforderungen.

    Eine typische MINIT-Methode ist wie folgt:

    PHP_MINIT_FUNCTION(extension_name){ /* Funktionen, Klassen usw. initialisieren */ }

    Der zweite Schritt des PHP-Starts des PHP-Betriebsmechanismus

    Wenn eine Seitenanforderung auftritt, übergibt die SAPI-Schicht die Kontrolle an die PHP-Schicht. Daher legt PHP die Umgebungsvariablen fest, die zur Beantwortung dieser Anfrage erforderlich sind. Gleichzeitig wird eine Variablentabelle erstellt, in der die während der Ausführung generierten Variablennamen und -werte gespeichert werden. PHP ruft die RINIT-Methode jedes Moduls auf, bei der es sich um „Anforderungsinitialisierung“ handelt. Ein klassisches Beispiel ist das RINIT des Session-Moduls, wenn das Session-Modul in php.ini aktiviert ist und der entsprechende Inhalt beim Aufruf der RINIT-Methode eingelesen wird als Der Vorbereitungsprozess startet automatisch zwischen Programmausführungen.

    Eine typische RINIT-Methode ist wie folgt:

    PHP_RINIT_FUNCTION(extension_name) { /* Sitzungsvariablen initialisieren, Variablen vorab auffüllen, globale Variablen neu definieren usw. */ }

    PHP run Der erste Schritt des PHP-Shutdown-Mechanismus

    Genau wie der PHP-Start ist auch das PHP-Shutdown in zwei Schritte unterteilt: Sobald die Seite ausgeführt wird (unabhängig davon, ob sie das Ende der Datei erreicht oder mit Exit oder Die beendet wird). Funktion), PHP startet die Bereinigungsprozedur. Es ruft nacheinander die RSHUTDOWN-Methode jedes Moduls auf. RSHUTDOWN wird verwendet, um die Symboltabelle zu löschen, die während der Ausführung des Programms generiert wird, d. h. um die Unset-Funktion für jede Variable aufzurufen.

    Eine typische RSHUTDOWN-Methode lautet wie folgt:

    PHP_RSHUTDOWN_FUNCTION(extension_name) { /* Speicherverwaltung durchführen, alle im letzten PHP-Aufruf verwendeten Variablen zurücksetzen usw. */ }

    PHP Der zweite Schritt des PHP-Abschaltens des Betriebsmechanismus

    Schließlich wurden alle Anfragen verarbeitet und SAPI ist bereit zum Herunterfahren. PHP beginnt mit der Ausführung des zweiten Schritts: PHP ruft die MSHUTDOWN-Methode jeder Erweiterung auf. Dies ist das Modul. Letzte Chance, Speicher freizugeben.

    Eine typische RSHUTDOWN-Methode lautet wie folgt:

    PHP_MSHUTDOWN_FUNCTION(extension_name) { /* Freie Handler und persistenter Speicher usw. */ }

    Auf diese Weise das gesamte PHP-Leben Der Zyklus ist vorbei. Es ist zu beachten, dass der „Startschritt eins“ und der „Abschlussschritt zwei“ nur dann ausgeführt werden, wenn keine Anfrage vom Server vorliegt.

    Verwandte Empfehlungen:

    Detaillierte Erläuterung des zugrunde liegenden Betriebsmechanismuscodes von JavaScript-Abschlüssen

    Der zugrunde liegende Betriebsmechanismus von JavaScript-Abschlüssen

    Erkundung des zugrunde liegenden Betriebsmechanismus von PHP_PHP-Tutorial

    Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des zugrunde liegenden Betriebsmechanismus von PHP. 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

    AI Hentai Generator

    AI Hentai Generator

    Erstellen Sie kostenlos Ai Hentai.

    Heißer Artikel

    R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
    2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
    Repo: Wie man Teamkollegen wiederbelebt
    4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
    Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
    4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

    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)

    CakePHP-Projektkonfiguration CakePHP-Projektkonfiguration Sep 10, 2024 pm 05:25 PM

    In diesem Kapitel werden wir die Umgebungsvariablen, die allgemeine Konfiguration, die Datenbankkonfiguration und die E-Mail-Konfiguration in CakePHP verstehen.

    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.

    CakePHP Datum und Uhrzeit CakePHP Datum und Uhrzeit Sep 10, 2024 pm 05:27 PM

    Um in cakephp4 mit Datum und Uhrzeit zu arbeiten, verwenden wir die verfügbare FrozenTime-Klasse.

    CakePHP-Datei hochladen CakePHP-Datei hochladen Sep 10, 2024 pm 05:27 PM

    Um am Datei-Upload zu arbeiten, verwenden wir den Formular-Helfer. Hier ist ein Beispiel für den Datei-Upload.

    CakePHP-Routing CakePHP-Routing Sep 10, 2024 pm 05:25 PM

    In diesem Kapitel lernen wir die folgenden Themen im Zusammenhang mit dem Routing kennen.

    Besprechen Sie CakePHP Besprechen Sie CakePHP Sep 10, 2024 pm 05:28 PM

    CakePHP ist ein Open-Source-Framework für PHP. Es soll die Entwicklung, Bereitstellung und Wartung von Anwendungen erheblich vereinfachen. CakePHP basiert auf einer MVC-ähnlichen Architektur, die sowohl leistungsstark als auch leicht zu verstehen ist. Modelle, Ansichten und Controller gu

    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

    CakePHP erstellt Validatoren CakePHP erstellt Validatoren Sep 10, 2024 pm 05:26 PM

    Der Validator kann durch Hinzufügen der folgenden zwei Zeilen im Controller erstellt werden.

    See all articles