gc_collect_cycles în PHP

Pornește imediat colectorul de referințe circulare și returnează câte valori a eliberat.

Sintaxă
gc_collect_cycles(): int

Ce face gc_collect_cycles

PHP eliberează memoria unui obiect când nu mai există nicio variabilă care să arate spre el. Două obiecte care arată unul spre celălalt (o referință circulară) nu ajung niciodată la zero și rămân în memorie. Colectorul de gunoi (garbage collector) le găsește periodic și le eliberează.

Colectorul pornește singur când se adună destui candidați (implicit în jur de 10.000). gc_collect_cycles îl pornește imediat; este util în scripturi care rulează mult timp, de exemplu importuri mari.

Ce returnează

Numărul de valori eliberate.

Exemple

Exemplul 1: Eliberarea unor referințe circulare

Fiecare pereche are două obiecte care se referă unul la altul, deci trei perechi înseamnă șase valori eliberate.

<?php
class Nod
{
    public ?Nod $vecin = null;
}

for ($i = 0; $i < 3; $i++) {
    $a = new Nod();
    $b = new Nod();
    $a->vecin = $b;
    $b->vecin = $a;
}
unset($a, $b);

echo "Valori eliberate: " . gc_collect_cycles();

Rezultat

Valori eliberate: 6

Greșeli frecvente

  • Apelezi gc_collect_cycles după fiecare linie ca să „economisești memorie”. Colectorul are un cost; apelează-l rar, de exemplu o dată la câteva mii de elemente procesate.

Comenzi înrudite

  • gc_enable: Pornește colectorul de referințe circulare (dacă a fost oprit).
  • gc_status: Returnează statistici despre colectorul de referințe circulare: de câte ori a rulat, câte valori a eliberat etc.
  • gc_mem_caches: Eliberează memoria păstrată în rezervă de managerul de memorie al PHP și returnează câți octeți a eliberat.