Start · Sprachen · PHP · Referenz · gc_enabled

gc_enabled

Funktion

Gibt zurück, ob der zyklische Garbage Collector (Speicherbereiniger für zirkuläre Referenzen) aktuell aktiviert ist.

seit PHP 5.3.0 Kategorie: misc

Signatur

gc_enabled(): bool

Beschreibung

gc_enabled() prüft, ob der in PHP eingebaute Garbage Collector für zirkuläre Referenzen aktiv ist. Dieser Mechanismus erkennt und bereinigt Objektgraphen und Arrays, die sich gegenseitig referenzieren und daher durch das normale Referenz-Counting nicht freigegeben werden können.

Der zyklische Garbage Collector ist seit PHP 5.3 standardmäßig aktiviert und kann über die INI-Direktive zend.enable_gc sowie zur Laufzeit mit gc_enable() und gc_disable() gesteuert werden. Mit gc_enabled() lässt sich der aktuelle Zustand abfragen, bevor man ihn ändert oder Annahmen über das Speicherverhalten trifft.

Typische Einsatzgebiete sind lang laufende Skripte (z. B. CLI-Daemons, Queue-Worker), bei denen man den GC gezielt deaktivieren und manuell mit gc_collect_cycles() auslösen möchte, um den Overhead zu reduzieren. Mit gc_enabled() kann man dabei sicherstellen, dass der ursprüngliche Zustand wiederhergestellt wird.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der zyklische Garbage Collector aktiviert ist, andernfalls false.

Beispiele

Status des Garbage Collectors abfragen

<?php
if (gc_enabled()) {
    echo "Garbage Collector ist aktiviert.";
} else {
    echo "Garbage Collector ist deaktiviert.";
}
?>
Garbage Collector ist aktiviert.

GC temporär deaktivieren und anschließend wiederherstellen

<?php
// Ursprünglichen Status merken
$gcWasEnabled = gc_enabled();

// GC für intensiven Verarbeitungsblock deaktivieren
gc_disable();

// Simulierter Verarbeitungsblock mit vielen Objekten
$objects = [];
for ($i = 0; $i < 10000; $i++) {
    $obj = new stdClass();
    $obj->self = $obj; // Zirkuläre Referenz
    $objects[] = $obj;
}
unset($objects);

// Zyklen manuell einsammeln
$collected = gc_collect_cycles();
echo "Gesammelte Zyklen: {$collected}\n";

// GC-Status wiederherstellen
if ($gcWasEnabled) {
    gc_enable();
}

echo gc_enabled() ? "GC wieder aktiv." : "GC bleibt deaktiviert.";
?>
Gesammelte Zyklen: 10000 GC wieder aktiv.

// Wichtig · Fallstricke

Der zyklische Garbage Collector befasst sich ausschließlich mit zirkulären Referenzen. Normale Variablen ohne Zyklen werden weiterhin sofort durch Referenz-Counting freigegeben, unabhängig vom Status des GC.

In sehr performance-kritischen Skripten kann das Deaktivieren des GC und der manuelle Aufruf von gc_collect_cycles() zu messbaren Laufzeitverbesserungen führen. gc_enabled() hilft dabei, den Ausgangszustand korrekt zu sichern und nach dem kritischen Abschnitt wiederherzustellen.