Start · Sprachen · PHP · Referenz · gc_enable

gc_enable

Funktion

Aktiviert den zyklischen Garbage Collector (Zirkulärreferenz-Kollektor) in PHP.

seit PHP 5.3.0 Kategorie: misc

Signatur

gc_enable(): void

Beschreibung

gc_enable() schaltet den PHP-Garbage-Collector ein, der speziell für die Erkennung und Bereinigung von zirkulären Referenzen zuständig ist. Zirkuläre Referenzen entstehen, wenn zwei oder mehr Objekte bzw. Arrays gegenseitig aufeinander verweisen und dadurch der normale Referenzzähler sie nicht automatisch freigibt.

Standardmäßig ist der zyklische Garbage Collector in PHP aktiviert (steuerbar über die php.ini-Direktive zend.enable_gc). Falls er explizit deaktiviert wurde – z. B. über gc_disable() in einem leistungskritischen Abschnitt –, kann er mit gc_enable() wieder eingeschaltet werden.

Der Einsatz ist besonders sinnvoll bei lang laufenden Skripten (z. B. CLI-Prozesse, Worker oder Daemons), die viele Objekte mit gegenseitigen Verweisen erzeugen. Ohne aktiven Garbage Collector können solche Strukturen zu einem kontinuierlichen Speicheranstieg (Memory Leak) führen.

Nach dem Einschalten sammelt PHP automatisch zirkuläre Referenzen, sobald der interne Puffer eine bestimmte Schwelle (Standard: 10.000 Knoten) überschreitet. Eine manuelle Sammlung ist alternativ mit gc_collect_cycles() möglich.

Rückgabewert

Typ
void
Beschreibung
Gibt keinen Wert zurück.

Beispiele

Garbage Collector deaktivieren und nach kritischem Abschnitt wieder aktivieren

<?php
// Garbage Collector für einen leistungskritischen Abschnitt deaktivieren
gc_disable();

for ($i = 0; $i < 1000; $i++) {
    $obj = new stdClass();
    $obj->self = $obj; // Zirkuläre Referenz
    unset($obj);
}

// Garbage Collector wieder einschalten
gc_enable();

// Manuell einen Sammlungsdurchlauf auslösen
$collected = gc_collect_cycles();
echo "Gesammelte Zyklen: " . $collected . PHP_EOL;
Gesammelte Zyklen: 1000

Status des Garbage Collectors prüfen und ggf. aktivieren

<?php
if (!gc_enabled()) {
    gc_enable();
    echo "Garbage Collector wurde aktiviert." . PHP_EOL;
} else {
    echo "Garbage Collector ist bereits aktiv." . PHP_EOL;
}

echo "GC-Status: " . (gc_enabled() ? 'aktiviert' : 'deaktiviert') . PHP_EOL;
Garbage Collector ist bereits aktiv. GC-Status: aktiviert

// Wichtig · Fallstricke

Leistungshinweis: Das vorübergehende Deaktivieren des Garbage Collectors mit gc_disable() kann in sehr engen, kurzlebigen Schleifen die Performance verbessern, da der GC-Overhead entfällt. Wichtig ist jedoch, ihn danach mit gc_enable() wieder einzuschalten, um Speicherlecks zu vermeiden.

php.ini: Die Direktive zend.enable_gc = 1 steuert den Standardzustand. gc_enable() überschreibt diese Einstellung zur Laufzeit, beeinflusst aber nicht dauerhaft die php.ini.

Achtung: Zirkuläre Referenzen in Arrays werden seit PHP 5.3 ebenfalls durch den Collector erfasst, nicht nur Objekte.