In diesem Artikel werden fortgeschrittene Interviewfragen zum PHP-Garbage-Collection-Mechanismus mit Ihnen geteilt und Sie erhalten ein tiefgreifendes Verständnis des PHP-Garbage-Collection-Mechanismus. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird für alle hilfreich sein.
ps: Dieser Artikel enthält ausgewählte Interviewfragen und Wissensartikel.
PHP-Interviewfragen zum PHP-Garbage-Collection-Mechanismus, PHP-Garbage-Collection-Mechanismus, Referenzzählung (Referenzzählung), GC-Mechanismus, PHP kann Speicher automatisch verwalten und unnötige Objekte entfernen, PHP-Interviewfragen teilen den PHP-Garbage-Collection-Mechanismus. Interviewfragen:
Empfohlene Studie : „PHP-Video-Tutorial“
Stellen Sie den Garbage-Collection-Mechanismus von PHP vor
PHP verwendet den GC-Mechanismus zur Referenzzählung (Referenzzählung) und verwendet den Root-Puffer Wenn PHP feststellt, dass ein ZVAL mit einem Zirkelverweis vorhanden ist, wird dieser in den Root-Puffer gelegt. Wenn der Root-Puffer die angegebene Nummer in der Konfigurationsdatei erreicht, wird das durch den Zirkel verursachte Speicherverlustproblem gelöst Referenzen.
Welche der folgenden Aussagen zur PHP-Garbage-Collection ist falsch? A. Das Ein-/Ausschalten des Garbage-Collection-Mechanismus kann durch Ändern der PHP-Konfiguration erreicht werden.
B Er kann mit gc_enable() und gc_disable() im Programm aktiviert und deaktiviert werden.
Der Garbage-Collection-Mechanismus in C und PHP wird die Systemleistung erheblich verbessern.
D. Nach dem Einschalten des Garbage-Collection-Mechanismus kann im Falle von Speicherlecks viel Speicherplatz gespart werden. Da die Ausführung des Garbage-Collection-Algorithmus jedoch einige Zeit in Anspruch nimmt, erhöht sich die Ausführungszeit des Drehbuchs.
Referenzantwort: CAntwortanalyse: Der Garbage-Collection-Mechanismus in PHP erhöht nur den Zeitverbrauch, wenn der Recycling-Algorithmus tatsächlich ausgeführt wird. Bei normalen (kleineren) Skripten sollte es jedoch keinerlei Auswirkungen auf die Leistung geben.
Welche Aussage zum PHP-Garbage-Collection-Mechanismus ist falsch? A. In einem Müllzyklus können Sie herausfinden, welcher Teil Müll ist, indem Sie prüfen, ob die Referenzanzahl um 1 reduziert ist und welche Variablencontainer keine Referenzen haben.
B Sie können gc_enable() und gc_disable( aufrufen. ) Funktion zum Ein- und Ausschalten des Garbage-Collection-Mechanismus
C Sparen Sie Speicherverbrauch durch Bereinigen nicht verwendeter Variablen
D Die Garbage-Collection wird automatisch durchgeführt, nachdem der PHP-Code ausgeführt wurde, sodass keine manuelle Durchführung der Garbage-Collection erforderlich ist
Referenzantwort: DWissenskapitelAntwortanalyse: Die Ausführung eines PHP-Codes kann lange dauern, aber wenn in diesem Zeitraum nicht referenzierte Variablen vorhanden sind, belegt er Speicherplatz, was zu langsamem Betrieb und anderen Problemen führt
1. Konzept
Garbage Collection Mechanism (GC) bedeutet, wie der Name schon sagt, Abfallwiederverwendung. Es handelt sich um ein dynamisches Speicherzuweisungsschema. Es gibt automatisch zugewiesene Speicherblöcke frei, die vom Programm nicht mehr benötigt werden. Der Garbage-Collection-Mechanismus ermöglicht es Programmierern, sich nicht zu viele Gedanken über die Programmspeicherzuweisung zu machen, sodass sie mehr Energie in die Geschäftslogik investieren können.
Unter den verschiedenen gängigen Sprachen ist der Garbage-Collection-Mechanismus ein gemeinsames Merkmal der neuen Generation von Sprachen, wie Python, PHP, C#, Ruby usw., die alle den Garbage-Collection-Mechanismus verwenden.
2. PHP-Garbage-Collection-Mechanismus 1. Vor der PHP5.3-Version war der verwendete Garbage-Collection-Mechanismus einfach „Referenzzählung“.
Was ist Referenzzählung?
Da PHP in C geschrieben ist, gibt es in C so etwas wie eine Struktur. Unsere PHP-Variablen werden auf diese Weise in C gespeichert.
Jede PHP-Variable existiert in einem Container namens zval. Ein zval-Container enthält zusätzlich zum Variablennamen und -wert auch zwei Bytes mit zusätzlichen Informationen:
● Eines heißt „is_ref“, ein boolescher Wert wird verwendet, um anzugeben, ob diese Variable zum Referenzsatz gehört. Durch dieses Byte können wir gewöhnliche Variablen von Referenzvariablen in PHP unterscheiden.
●Das zweite zusätzliche Byte ist „refcount“, das verwendet wird, um die Anzahl der Variablen darzustellen, die auf diesen Container verweisen.
Das heißt:
① Jedem Speicherobjekt wird ein Zähler zugewiesen, wenn auf das Speicherobjekt verwiesen wird.
② Wenn die Variablenreferenz entfernt wird (nach der Ausführung von unset()), der Zähler -1 ;
③ Wenn der Zähler = 0 ist, bedeutet dies, dass das Speicherobjekt nicht verwendet wird, das Speicherobjekt zerstört wird und die Speicherbereinigung abgeschlossen ist.
Und PHP gibt den von diesem Prozess/Thread belegten Inhalt nach dem Ende eines Lebenszyklus frei. Diese Methode stellt fest, dass PHP in der frühen Phase nicht zu viele Speicherlecks berücksichtigen muss.
Wenn jedoch zwei oder mehr Objekte aufeinander verweisen, um einen Ring zu bilden, wird der Zähler des Speicherobjekts zu diesem Zeitpunkt nicht mehr auf 0 reduziert. Diese Gruppe von Speicherobjekten ist nicht mehr nützlich, kann aber nicht recycelt werden in Speicherlecks Phänomen.
Ab php5.3 wurde ein neuer Garbage-Collection-Mechanismus verwendet. Basierend auf der Referenzzählung wurde ein komplexer Algorithmus implementiert, um das Vorhandensein von Referenzringen in Speicherobjekten zu erkennen und so Speicherlecks zu vermeiden.
Wie es in der offiziellen Dokumentation heißt: Jede PHP-Variable existiert in einem Variablencontainer namens „zval“. Ein zval-Variablencontainer enthält zusätzlich zum Typ und Wert der Variablen zwei Bytes zusätzlicher Informationen. Der erste ist „is_ref“, ein boolescher Wert, der angibt, ob diese Variable zum Referenzsatz gehört. Durch dieses Byte kann die PHP-Engine gewöhnliche Variablen von Referenzvariablen unterscheiden. Da PHP Benutzern die Verwendung benutzerdefinierter Referenzen durch die Verwendung von & ermöglicht, gibt es im zval-Variablencontainer auch einen internen Referenzzählmechanismus, um die Speichernutzung zu optimieren.
Das zweite zusätzliche Byte ist „refcount“, das verwendet wird, um die Anzahl der Variablen (auch Symbole genannt) anzugeben, die auf diesen zval-Variablencontainer verweisen. Alle Symbole sind in einer Symboltabelle vorhanden und jedes Symbol hat einen Gültigkeitsbereich.
In der offiziellen Dokumentation heißt es, dass Sie Xdebug verwenden können, um den Referenzzähler zu überprüfen:
<?php $a = "new string"; $c = $b = $a; xdebug_debug_zval( 'a' ); unset( $b, $c ); xdebug_debug_zval( 'a' ); ?>
Die obige Routine gibt Folgendes aus:
a: (refcount=3, is_ref=0)='new string' a: (refcount=1, is_ref=0)='new string'
Hinweis: Ab der NTS-Version von PHP7 werden die Referenzen der obigen Routine nicht mehr gezählt. das ist c=b=$a Der Referenzzähler von a ist ebenfalls 1. Die spezifische. Klassifizierung ist wie folgt:
In PHP 7 kann zval referenziert oder nicht referenziert sein. In der zval-Struktur gibt es ein Flag, das dies bestimmt.
① Für Typvariablen null, bool, int und double zählt refcount nie;
② Für Objekte und Ressourcentypen stimmt die refcount count mit php5 überein.
③ Für Strings werden nicht referenzierte Variablen gezählt Zeichenfolge". Diese referenzierten Zeichenfolgen werden dedupliziert (d. h. es gibt nur eine eingefügte Zeichenfolge mit spezifischem Inhalt) und sind garantiert für die gesamte Dauer der Anforderung vorhanden. Daher besteht für sie keine Notwendigkeit, die Referenzzählung zu verwenden. Diese Zeichenfolgen bleiben bestehen im gemeinsam genutzten Speicher. In diesem Fall können Sie die Referenzzählung nicht verwenden (da unser Referenzzählmechanismus nicht atomar ist).
④ Bei Arrays werden nicht referenzierte Variablen als „unveränderliche Arrays“ bezeichnet. Die Anzahl der Arrays selbst stimmt mit PHP5 überein, aber die Anzahl der einzelnen Schlüssel-Wert-Paare im Array basiert auf den vorherigen drei Regeln (d. h. wenn es sich um eine Zeichenfolge handelt, wird sie nicht gezählt, wenn Opcache verwendet wird). , lautet das konstante Array-Literal im Code „In unveränderliches Array konvertieren“.
Auch diese leben im gemeinsamen Gedächtnis und können daher nicht erneut gezählt werden.
Unser Demo-Beispiel sieht wie folgt aus:
<?php echo '测试字符串引用计数'; $a = "new string"; $b = $a; xdebug_debug_zval( 'a' ); unset( $b); xdebug_debug_zval( 'a' ); $b = &$a; xdebug_debug_zval( 'a' ); echo '测试数组引用计数'; $c = array('a','b'); xdebug_debug_zval( 'c' ); $d = $c; xdebug_debug_zval( 'c' ); $c[2]='c'; xdebug_debug_zval( 'c' ); echo '测试int型计数'; $e = 1; xdebug_debug_zval( 'e' );
Die Ausgabe, die Sie sehen, ist wie folgt:
3. Recycling-Zyklus
Standardmäßig ist der Garbage-Collection-Mechanismus von PHP aktiviert, und es gibt einen php.ini Mit der Einstellung können Sie sie ändern: zend.enable_gc.
Wenn der Garbage-Collection-Mechanismus aktiviert ist, bestimmt der Algorithmus, dass immer dann, wenn der Root-Puffer voll ist, eine Schleifensuche durchgeführt wird. Der Root-Cache-Bereich hat eine feste Größe, der Standardwert ist 10.000. Dieser Wert kann durch Ändern der Konstante GC_ROOT_BUFFER_MAX_ENTRIES in der PHP-Quellcodedatei Zend/zend_gc.c und anschließendes Neukompilieren von PHP geändert werden. Wenn die Garbage Collection deaktiviert ist, wird der Schleifensuchalgorithmus nie ausgeführt, der Root bleibt jedoch immer im Root-Puffer vorhanden, unabhängig davon, ob die Garbage Collection in der Konfiguration aktiviert ist.
Zusätzlich zum Ändern der Konfiguration zend.enable_gc können Sie beim Ausführen von PHP auch den Garbage-Collection-Mechanismus ein- und ausschalten, indem Sie die Funktionen gc_enable() bzw. gc_disable() aufrufen. Der Aufruf dieser Funktionen hat die gleiche Wirkung wie das Ändern von Konfigurationselementen, um den Garbage-Collection-Mechanismus zu aktivieren oder zu deaktivieren. Möglichkeit, eine regelmäßige Erfassung zu erzwingen, auch wenn der Root-Puffer möglicherweise nicht voll ist. Zu diesem Zweck können Sie die Funktion gc_collect_cycles() aufrufen. Diese Funktion gibt die Anzahl der Zyklen zurück, die mit diesem Algorithmus recycelt wurden.
Der Grund, warum Sie das Ein- und Ausschalten der Garbage Collection und die autonome Initialisierung zulassen, liegt darin, dass einige Teile Ihrer Anwendung möglicherweise zeitkritisch sind. In diesem Fall möchten Sie die Garbage Collection wahrscheinlich nicht verwenden. Wenn Sie die Garbage Collection für bestimmte Teile Ihrer Anwendung deaktivieren, besteht natürlich das Risiko möglicher Speicherlecks, da einige mögliche Roots möglicherweise nicht in den begrenzten Root-Puffer passen.
Bevor Sie also die Funktion gc_disable() aufrufen, um den Speicher freizugeben, kann es sinnvoll sein, zuerst die Funktion gc_collect_cycles() aufzurufen. Da dadurch alle möglichen Roots gelöscht werden, die im Root-Puffer gespeichert wurden, kann beim Ausschalten des Garbage-Collection-Mechanismus ein leerer Puffer übrig bleiben, um mehr Platz zum Speichern möglicher Roots zu haben. 4. Auswirkungen auf die Leistung Bei der PHP-Ausführung wird die Garbage Collection durchgeführt, sobald der Root-Puffer voll ist oder die Funktion gc_collect_cycles() aufgerufen wird.
2. Erhöhte Ausführungszeit Der zweite Bereich, in dem sich die Speicherbereinigung auf die Leistung auswirkt, ist die Zeit, die benötigt wird, um verlorenen Speicher freizugeben. Normalerweise erhöht der Garbage-Collection-Mechanismus in PHP nur dann den Zeitverbrauch, wenn der Recycling-Algorithmus tatsächlich ausgeführt wird. Bei normalen (kleineren) Skripten sollte es jedoch keinerlei Auswirkungen auf die Leistung geben.
3. Wenn in normalen Skripten ein Recyclingmechanismus ausgeführt wird, können durch Speichereinsparungen mehr solcher Skripte gleichzeitig auf Ihrem Server ausgeführt werden. Weil der insgesamt verwendete Speicher die Obergrenze nicht erreicht hat.
Dieser Vorteil zeigt sich besonders deutlich bei Skripten mit langer Laufzeit, beispielsweise bei Testsuiten oder Daemon-Skripten mit langer Laufzeit. Gleichzeitig sollte der neue Garbage-Collection-Mechanismus für Skriptanwendungen, die normalerweise länger laufen als Webskripte, die lange vertretene Ansicht, dass Speicherlecks schwer zu beheben sind, erheblich ändern.
Abschließend wünsche ich allen viel Erfolg im Vorstellungsgespräch und den Erhalt Ihres Lieblingsangebots.Weitere Kenntnisse zum Thema Programmierung finden Sie unter:
Einführung in die Programmierung! !
Das obige ist der detaillierte Inhalt vonAusgewählte 3 Interviewfragen, die Ihnen helfen, den Garbage-Collection-Mechanismus von PHP zu verstehen! !. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!