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