Kann mir bitte jemand erklären unter welchen Umständen gc_collect_cycles Funktion kann nützlich sein? Sollte es aufgerufen werden, bevor eine erhebliche Speicherauslastung bevorsteht?
Wofür ist die gc_collect_cycles-Funktion nützlich?
PHP hat standardmäßig “Garbage Collector” aktiviert. Es wird verwendet, um Speicher freizugeben, der von “Müll” verwendet wird.
gc_collect_cycles()
erzwingt die Sammlung aller vorhandenen Garbage-Zyklen. Es gibt die Anzahl der gesammelten (freigegebenen) Zyklen (Objekte, Variablenwerte …) zurück. Enabled Garbage Collector ruft diese Funktion von Zeit zu Zeit intern auf, um Ressourcen freizugeben. In den meisten Fällen lebt PHP-Skript sehr kurz. In diesem Fall wird der gesamte Müll am Ende der Arbeit ohne Müllabfuhr vernichtet.
Manchmal ist es erforderlich, GC manuell zu verwalten:
gc_disable()
kann einige lange Operationen beschleunigen, führt aber auch zu einigen Speicher-Overheads.gc_collect_cycles()
könnte verwendet werden, um die richtigen Momente von GC zu spezifizieren.
Ein weiterer Grund zu verwenden gc_collect_cycles()
– Debuggen. Angenommen, Sie möchten wissen, wie hoch der Speicherverbrauch eines Codeblocks ist memory_get_usage()
. Sie müssen GC zuerst deaktivieren, an anderer Stelle erhalten Sie falsche Ergebnisse. Danach möchten Sie die von GC und Ihrer Anwendung verbrauchte Zeit trennen. Also rufe gc_collect_cycles()
und Timings/Erinnerung vorher und nachher messen.
Kleines Beispiel:
class A {
public $ref;
public $name;
public function __construct($name) {
$this->name = $name;
echo($this->name.'->__construct();'.PHP_EOL);
}
public function __destruct() {
echo($this->name.'->__destruct();'.PHP_EOL);
}
}
gc_disable();
$a1 = new A('$a1');
$a2 = new A('$a2');
$a1->ref = $a2;
$a2->ref = $a1;
$b = new A('$b');
$b->ref = $a1;
echo('$a1 = $a2 = $b = NULL;'.PHP_EOL);
$a1 = $a2 = $b = NULL;
echo('gc_collect_cycles();'.PHP_EOL);
echo('// removed cycles: '.gc_collect_cycles().PHP_EOL);
echo('exit();'.PHP_EOL);
Wird ausgegeben:
$a1->__construct();
$a2->__construct();
$b->__construct();
$a1 = $a2 => $b = NULL;
$b->__destruct();
gc_collect_cycles();
$a2->__destruct();
$a1->__destruct();
// removed cycles: 4
Damit ist nur gemeint $b
wurde zerstört, als es gefragt wurde. Sonstiges $a1
und $a2
hat zyklische Verweise, und es ist name
Eigenschaften verbrauchen auch Speicher. Zwei Objekte + zwei Strings = 4 (entfernt von gc_collect_cycles()
).
-
Danke @clover! Ich habe mich immer gefragt, wie wir einige Ressourcen freigeben können. Das ist clever und einfach!
– GTodorow
27. April 2020 um 0:49 Uhr
Hilft das? php.net/manual/en/features.gc.collecting-cycles.php
– Mike B
31. Oktober 2013 um 19:31 Uhr
Es scheint, als wäre gc_collect_cycles nur dann wirklich nützlich, wenn der GC ist deaktiviert.
– Benutzer2864740
31. Oktober 2013 um 19:48 Uhr