Heim > Backend-Entwicklung > PHP-Tutorial > PHP Master | Besser verstehen die Müllsammlung von PHP

PHP Master | Besser verstehen die Müllsammlung von PHP

尊渡假赌尊渡假赌尊渡假赌
Freigeben: 2025-02-26 08:33:13
Original
195 Leute haben es durchsucht

PHP Master | Better Understanding PHP’s Garbage Collection

Zeit ändert sich und die Begriffe ändern sich entsprechend. Heute nennen wir es "PHP Resource Recycling" und nicht "Müllrecycling". Dies spiegelt seine Essenz enger wider: Es wird nicht einfach weggeworfen, sondern Ressourcen, die nicht mehr verwendet werden. Es ist jedoch häufiger, der Geschichte des "Müllrecyclings" zu folgen.

Kernpunkte:

    Die Müllsammlung von
  • PHP ist in drei Ebenen unterteilt: Umfangsende, Referenzzählung und formale Müllsammlung. Am Ende des Umfangs werden Ressourcen in einer Funktion, einem Skript oder einer Sitzung gelöscht. Die Referenzzahl verfolgt die Anzahl der Entitäten anhand einer Variablen. Der in PHP 5.3 eingeführte formale Müllsammlungsmechanismus befasst sich mit Fällen, in denen die Referenzzählungen ungleich Null sind, aber weiter abnehmen können.
  • Die Müllsammlung von
  • PHP ist immer aktiviert, kann jedoch manuell gesteuert werden. Es kann in der Datei php.ini oder im Skript unter Verwendung der Funktionen gc_enable () und gc_disable () deaktiviert werden. Die Funktion GC_COLLECT_CYCLEN () ermöglicht es, eine manuelle Müllsammlung zu starten, und die Größe der Stammpuffer kann im PHP -Quellcode geändert werden.
  • Während die Müllsammlung hilft, Speicherzuweisung zu verwalten und Speicherlecks zu verhindern, können die ressourcenintensiven Eigenschaften auch die Leistung beeinflussen. Daher sollte es strategisch verwendet werden, insbesondere in langjährigen Skripten oder unendlichen Skripten, in denen die Müllsammlung entscheidend ist, um Speicherlecks zu verhindern.
  • Gute Programmierpraktiken helfen dabei, die Müllsammlung zu optimieren. Dies beinhaltet die Minimierung oder Beseitigung globaler Variablen, Bindungsvariablen an Scopes und die Beachtung der Situationen, in denen Array -Verschachtelung oder Objekt Objekte referenzieren, da diese Situationen zu Speicherlecks führen können und auch das Hauptziel formaler Müllsammlungsmechanismen sind.

Programm erzeugt Müll

Programm verwendet Ressourcen, manchmal kleine Ressourcen, manchmal große Ressourcen. Zum Beispiel Datenfelder. Ein Programm kann ein Datenfeld definieren (z. B. eine Seriennummer) und es im Programm verwenden. Nach der Definition nimmt dieses Datenfeld Speicherplatz ein, möglicherweise nur wenige Bytes, aber noch Platz. Da jede Maschine oder die Programmierumgebung nur einen begrenzten Platz bietet, verringert der verbleibende Platz den Platz, der von diesem Feld besetzt ist. Wenn das Programm endet, verschwindet das Programm und jeder Bereich, den es verbraucht, und der gesamte verfügbare Platz wird in der maximalen Größe wiederhergestellt. Aber was passiert, wenn das Programm niemals endet? Ich habe schon einige dieser Programme geschrieben. Sie sind schöne Meisterwerke und ich bin immer glücklich, wenn andere im Workshop bemerken, dass ich einen geschaffen habe. Nichts zeigt Ihre Fähigkeiten besser als ein großer IBM -Computer selbst und in den umliegenden Fächern ruft eine Person nach dem anderen: „Hey, stimmt etwas mit dem System nicht?“ lenken Sie die Aufmerksamkeit von Ihnen ab. Einige Programme sind jedoch sogar so konzipiert, dass sie für immer laufen, wie Dämonen und andere solche Programme. Während sie laufen, kann die Menge an Müll, die sie erzeugen, weiter wachsen. Wenn die verschlossenen Ressourcen groß sind, wirkt sich dies wirklich negativ auf das System aus. Daher muss jede Sprache eine Möglichkeit haben, Waisenressourcen zu löschen, sie anderen Benutzern zur Verfügung zu stellen und sicherzustellen, dass die Gesamtmenge des verfügbaren Systemraums gleich bleibt. Glücklicherweise verwendet PHP eine dreischichtige Methode zur Entfernung von Müll.

Erste Schicht - End des Umfangs

Zuallererst wird, wie die meisten Sprachen, bei endet, alles in diesem Umfang zerstört und alle zugewiesenen Ressourcen befreit. Scopes können Funktionen, Skripte, Sitzungen usw. abdecken. Wenn das Zielfernrohr endet, endet alles, was es hält. Natürlich können Sie Ressourcen jederzeit mit der Funktion "set () freilegen. Dies ist einer der Gründe, warum Funktionen und Methoden so wichtig sind, weil sie Bereiche einrichten, angeben, wann eine bestimmte Speicherverwendung beginnt und endet, und begrenzt, wie lange Dinge existieren. Sie sollten nach Möglichkeit verwendet werden, nicht globale Einheiten.

zweite Schicht - Zitatzahl

Zweitens verwendet PHP wie die meisten Skriptsprachen eine Technik, die als Referenzzählung bezeichnet wird, um zu verfolgen, wie viele Entitäten eine bestimmte Variable verwenden. Beim Erstellen einer Variablen in einem PHP -Skript erstellt PHP einen kleinen "Container" namens ZVAL, der aus dem Wert besteht, der der Variablen plus zwei weitere Informationen zugewiesen ist: IS_REF und RefCount. Der ZVAL -Container wird in einer Tabelle gespeichert, und jedes Umfang (Skripte, Funktionen, Methoden usw.) hat eine Tabelle. IS_REF ist ein einfacher wahrer/falscher Wert, der angibt, ob die Variable Teil des Referenzsatzes ist, wodurch PHP feststellt, ob es sich um eine einfache Variable oder eine Referenz handelt. RefCount ist interessanter, da es einen numerischen Wert enthält, der angibt, wie viele verschiedene Variablen diesen Wert verwenden. Das heißt, wenn Sie die Variable $ Dave = 6 definieren, wird RefCount auf 1 gesetzt. Wenn ich $ programmer = $ Dave sage, wird RefCount auf 2 erhöht. PHP weiß, dass er kein zweites ZVAL für Wert 6 erstellt. Dieser RefCount nimmt ab, wenn das Programm endet, entweder wenn wir den Umfang der Funktion verlassen oder bei Verwendung von UnSet (). Wenn RefCount Null erreicht, wird ZVAL zerstört und jeder Gedächtnis, den es hält, wird jetzt befreit. Dies ist natürlich ein einfaches Beispiel für eine einfache Variable. Wenn Sie über ein Array oder Objekt sprechen, ist die Situation viel komplizierter, da mehrere ZREFs für mehrere Elemente im Array erstellt werden, die grundlegende Verarbeitung ist jedoch dieselbe. Wenn wir jedoch Arrays in einem anderen Array verwenden, das häufig in komplexeren PHP -Skripten auftritt, treten Probleme auf. In diesem Fall wird der ursprüngliche Array -Wert festgelegt, der RefCount des Arraywerts auf 1 gesetzt, und wenn das Array einem anderen Array zugeordnet ist, wird der RefCount auf 2 erhöht. Wenn der Verwendungsbereich des zweiten Array endet, wird RefCount durch 1 abgeschlossen. Wir befinden uns jetzt in einer Situation, in der der Wert selbst nicht mehr mit irgendetwas verbunden ist, sondern die RefCount des Containers (ZVAL), die darstellt, dass er immer noch größer als Null ist. Das Endergebnis ist, dass der vom ursprünglichen Array dargestellte Speicher nicht befreit wird und diese Speichermenge jetzt für irgendetwas nicht verfügbar ist. Oft denken wir, dass dieser verlorene Speicher klein ist, aber normalerweise nicht der Fall ist. Arrays können heutzutage sehr große Dinge sein, und es ist besonders problematisch, wenn das Skript ein Daemon oder eine andere Funktion ist, die fast kontinuierlich ausgeführt wird. In diesem Fall kann das resultierende "Speicherleck" katastrophale Konsequenzen für die Leistung und sogar die Betriebsfunktionen des Servers haben.

Der dritte Stock - Formal Müllrecycling

Offensichtlich hat die Löschung, die auf der Referenzzahl basiert, ihre Grenzen, aber zum Glück bietet PHP 5.3 eine weitere Option, um diese Situation zu unterstützen. Der spezifische Fall, den wir möchten, dass der Zyklus der Müllabfuhr gelöst wird, ist der Fall, in dem ZVAL abnimmt, aber immer noch ungleich Null ist. Grundsätzlich ist die Schleife, um zu erkennen, welche Werte weiter dekrementiert werden können, und dann die Werte mit Null freizusetzen. Was tatsächlich passiert, ist, dass PHP alle Root Container (ZVAL) verfolgt. Dies geschieht unabhängig davon, ob die Müllsammlung eingeschaltet ist oder nicht (da dies nur tun muss, ohne zu fragen, ob die Müllsammlung eingeschaltet ist oder nicht usw.). Dieser Root -Puffer kann bis zu 10.000 Wurzeln enthalten (feste Größe, dies kann jedoch geändert werden). Wenn es sich füllt, beginnt der Müllsammlungsmechanismus mit der Analyse dieses Puffers. Das erste, was die GC -Routine tut, ist, durch den Wurzelpuffer zu iterieren und alle ZVAL -Zahlen um 1 zu verringern. Bei diesem markiert es jedes Tag mit einem kleinen Tag wie einem Scheck einen, so dass es die Wurzel nur einmal verringert. Es iteriert dann und markiert (diesmal mit einer kleinen welligen Linie) alle Zvals, deren reduzierte Anzahl Null ist. Werte, die ungleich Null sind, werden so erhöht, dass sie zu ihren ursprünglichen Werten zurückkehren. Schließlich wird es erneut scrollen, das Zval ungleich Null aus dem Puffer löschen und den Laden mit dem Wert von Null RefCount befreien. Die Müllsammlung ist in PHP immer aktiviert, aber Sie können sie mit der Direktive Zend.Enable_gc in der Php.ini -Datei ausschalten. Alternativ können Sie dies im Skript tun, indem Sie die Funktionen gc_enable () und gc_disable () aufrufen. Wie oben erwähnt, läuft es, wenn die Müllsammlung aktiviert ist, ausgeführt, wenn das Root voll ist. Sie können diese Einstellung jedoch überschreiben und die Sammlung mit der Funktion gc_collect_cycles () ausführen, wenn Sie Fit sehen. Und Sie können die Größe des Stammpuffers mit dem Wert gc_root_buffer_max_entries in Zend/Zend_gc.c im PHP -Quellcode ändern. Alles in allem ermöglicht es Ihnen, zu steuern, ob und wann und wo der GC ausgeführt wird, was eine gute Sache ist, weil es ein bisschen ressourcenintensiv ist und daher möglicherweise nicht die Art von Dingen ist, die Sie nach Belieben laufen.

Wann verwendet es

Da die Müllsammlung die Leistung beeinträchtigen kann, lohnt es sich, sich die Zeit zu nehmen, um festzustellen, wann Sie sie verwenden sollten. Denken Sie zunächst daran, dass die formale Müllsammlung nicht öffentlich (mit der Funktion gc_collect_cycles ()) ausführt (mit der Funktion gc_collect_cycles ()), vor der Stammtabelle (10.000 Einträge) füllt sich diese Tabelle, und da diese Tabelle auf der Ebene der Umfang ist, ist dies für kleine diese gewonnen. ' T passieren mit Funktionen. Sollten Sie es für kleine Skripte verwenden? Es liegt an Ihnen. Es ist schwer zu sagen, dass laufende Operationen wie Garbage Collection eine schlechte Sache sind, aber wenn Sie kleine, schnell laufende Skripte haben, die beginnen und enden und verschwinden, gibt es möglicherweise nicht viel Belohnung. Wenn Ihr Server jedoch viele kleine Skripte ausführt, die anhaltend bleiben, kann dies die Mühe wert sein. Die einzige Möglichkeit, wirklich zu wissen, besteht darin, einen Benchmark für Ihre Bewerbung festzulegen und ihn anzusehen. Wenn Sie über langjährige Skripte verfügen, insbesondere diejenigen, die niemals enden, ist die Müllsammlung von entscheidender Bedeutung, wenn Sie die oben besprochenen Speicherlecks verhindern möchten. Am wichtigsten ist vielleicht, dass wir immer versuchen sollten, gute Programmierleitfäden zu folgen, damit wir globale Variablen minimieren oder beseitigen und unsere Variablen an den Geltungsbereich binden, sodass wir, selbst wenn wir langlebige Skripte haben, dieser Speicher am Ende der Funktion befreit werden kann. Nicht am Ende des Skripts. Beachten Sie auch, wann in einem Array ein Array- oder Objektreferenzobjekt verwendet wird, da diese Situation zu Speicherlecks führen kann und das eigentliche Ziel des formalen Müllsammlungsprozesses ist.

Bilder aus Fotolien

Php Müllrecycling FAQ (FAQ)

(Der FAQ-Teil wird hier weggelassen, da der Artikel zu lang ist und nicht mit dem pseudooriginalen Ziel übereinstimmt. Der Inhalt des FAQ kann nach der Änderung geändert werden.)

Das obige ist der detaillierte Inhalt vonPHP Master | Besser verstehen die Müllsammlung 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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage