Start · Sprachen · PHP · Referenz · gc_status

gc_status

Funktion

Gibt ein assoziatives Array mit aktuellen Statusinformationen über den PHP-Garbage-Collector zurück.

seit PHP 7.3.0 Kategorie: misc

Signatur

gc_status(): array

Beschreibung

gc_status() liefert einen Schnappschuss des internen Zustands des zyklischen Garbage Collectors (GC) von PHP. Das zurückgegebene Array enthält Kennzahlen wie die Anzahl der bisher ausgeführten GC-Zyklen, die Anzahl der gesammelten und befreiten Objekte sowie Informationen darüber, ob der GC aktuell aktiv ist.

Die Funktion ist besonders nützlich beim Profiling und Debugging von langlebigen PHP-Prozessen (z. B. Daemons, Worker-Scripts oder langlaufende CLI-Skripte), bei denen unkontrolliertes Anwachsen des Speichers durch zirkuläre Referenzen ein Problem darstellen kann.

Typische Schlüssel des zurückgegebenen Arrays sind: runs (Anzahl der GC-Durchläufe), collected (Anzahl gesammelter Wurzeln), threshold (Schwellwert ab dem GC ausgelöst wird), roots (aktuelle Anzahl möglicher Zykluswurzeln) sowie enabled (ob der GC aktiv ist). Ab PHP 8.x kommen weitere Felder hinzu, etwa buffer_size.

Durch regelmäßiges Abfragen von gc_status() lässt sich erkennen, ob und wie oft der Garbage Collector eingreift – und ob es sinnvoll ist, ihn manuell per gc_collect_cycles() auszulösen oder seine Konfiguration über gc_enable()/gc_disable() anzupassen.

Rückgabewert

Typ
array
Beschreibung
Gibt ein assoziatives Array mit GC-Statusinformationen zurück. Enthält mindestens die Schlüssel runs, collected, threshold, roots und enabled. Ab PHP 8.x sind zusätzliche Felder wie buffer_size vorhanden.

Beispiele

GC-Status ausgeben

<?php
// GC-Status vor und nach dem Erzeugen zirkulärer Referenzen vergleichen
$vorher = gc_status();
echo 'GC-Läufe vorher: ' . $vorher['runs'] . PHP_EOL;
echo 'Roots vorher: '    . $vorher['roots'] . PHP_EOL;

// Zirkuläre Referenzen erzeugen
for ($i = 0; $i < 200; $i++) {
    $a = new stdClass();
    $b = new stdClass();
    $a->b = $b;
    $b->a = $a;
    // $a und $b gehen hier aus dem Scope — bilden Zyklen
}

$nachher = gc_status();
echo 'GC-Läufe nachher: ' . $nachher['runs']      . PHP_EOL;
echo 'Gesammelt:        ' . $nachher['collected']  . PHP_EOL;
echo 'Aktiv:            ' . ($nachher['enabled'] ? 'ja' : 'nein') . PHP_EOL;
GC-Läufe vorher: 0 Roots vorher: 0 GC-Läufe nachher: 1 Gesammelt: 400 Aktiv: ja

GC-Monitoring in einem langlaufenden Prozess

<?php
// Simulierter Worker, der alle 1000 Iterationen den GC-Status prüft
function processItem(int $id): void {
    // Simulierte Arbeit mit potenziellen Zyklen
    $obj = new stdClass();
    $obj->self = $obj;
}

for ($i = 1; $i <= 5000; $i++) {
    processItem($i);

    if ($i % 1000 === 0) {
        $status = gc_status();
        printf(
            "[Iteration %5d] Roots: %d | GC-Läufe: %d | Gesammelt: %d\n",
            $i,
            $status['roots'],
            $status['runs'],
            $status['collected']
        );

        // Manuell bereinigen, falls viele Roots vorhanden
        if ($status['roots'] > 500) {
            gc_collect_cycles();
        }
    }
}
[Iteration 1000] Roots: 1000 | GC-Läufe: 2 | Gesammelt: 2000 [Iteration 2000] Roots: 1000 | GC-Läufe: 4 | Gesammelt: 4000 [Iteration 3000] Roots: 1000 | GC-Läufe: 6 | Gesammelt: 6000 [Iteration 4000] Roots: 1000 | GC-Läufe: 8 | Gesammelt: 8000 [Iteration 5000] Roots: 1000 | GC-Läufe: 10 | Gesammelt: 10000

// Wichtig · Fallstricke

Die genaue Zusammensetzung des zurückgegebenen Arrays kann sich zwischen PHP-Versionen unterscheiden. Vor dem produktiven Einsatz sollte geprüft werden, welche Schlüssel in der eingesetzten PHP-Version verfügbar sind.

Der Schwellwert threshold wird durch die INI-Einstellung zend.gc_threshold (ab PHP 8.0) bzw. intern berechnet und bestimmt, ab wie vielen Wurzeln ein automatischer GC-Lauf ausgelöst wird. Der Standardwert liegt bei 10.001.

Achtung: Häufiges manuelles Auslösen des GC (gc_collect_cycles()) kann die Performance beeinträchtigen. gc_status() selbst ist sehr leichtgewichtig und erzeugt keinen GC-Lauf.