Signatur
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
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.";
}
?>
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.";
?>
// 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.