Wofür ist die gc_collect_cycles-Funktion nützlich?

Lesezeit: 2 Minuten

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?

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:

  1. gc_disable() kann einige lange Operationen beschleunigen, führt aber auch zu einigen Speicher-Overheads.
  2. 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

1405560cookie-checkWofür ist die gc_collect_cycles-Funktion nützlich?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy