Signatur
Beschreibung
gc_mem_caches() weist den internen Speichermanager der Zend Engine an, aktuell gehaltene Speichercaches freizugeben. Die Zend Engine hält intern bestimmte Speicherbereiche vor (z. B. für häufig allozierte Strukturen), um wiederholte Allokationen zu beschleunigen. Diese Funktion leert genau diese internen Caches und gibt den dadurch freigewordenen Speicher zurück.
Die Funktion ist besonders nützlich in langlaufenden PHP-Prozessen (z. B. CLI-Skripte, Worker-Prozesse oder Daemons), bei denen der Speicherverbrauch über Zeit ansteigen kann. Nach speicherintensiven Operationen – etwa dem Verarbeiten großer Datenmengen oder dem Aufbau komplexer Objektstrukturen – kann ein Aufruf von gc_mem_caches() dazu beitragen, den Speicherbedarf zu reduzieren.
Im Gegensatz zur Garbage-Collection (gc_collect_cycles()), die zirkuläre Referenzen auflöst, zielt gc_mem_caches() auf die internen Speicherreserven der Engine selbst ab. Beide Funktionen können kombiniert werden, um den Speicherverbrauch eines Prozesses zu minimieren.
Der Rückgabewert gibt an, wie viele Bytes tatsächlich freigegeben wurden. In normalen Web-Request-Szenarien ist der Effekt meist gering, da PHP den Speicher nach jedem Request ohnehin freigibt.
Rückgabewert
int zurück. Wurden keine internen Caches gehalten, wird 0 zurückgegeben.Beispiele
Speicher nach speicherintensiver Operation freigeben
<?php
// Speicherintensive Operation simulieren
$data = [];
for ($i = 0; $i < 100000; $i++) {
$data[] = str_repeat('x', 100);
}
unset($data);
// Garbage Collection und interne Caches freigeben
gc_collect_cycles();
$freed = gc_mem_caches();
echo "Freigegebene Bytes durch gc_mem_caches(): " . $freed . PHP_EOL;
echo "Aktueller Speicherverbrauch: " . memory_get_usage(true) . " Bytes" . PHP_EOL;
Einsatz in einem langlaufenden Worker-Prozess
<?php
// Beispiel: Worker-Schleife mit periodischer Speicherbereinigung
$iteration = 0;
while (true) {
$iteration++;
// Verarbeitungslogik (vereinfacht)
$batch = range(1, 1000);
$result = array_map(fn($n) => $n * 2, $batch);
unset($batch, $result);
// Alle 100 Iterationen Speicher bereinigen
if ($iteration % 100 === 0) {
gc_collect_cycles();
$freed = gc_mem_caches();
echo "[Iteration $iteration] gc_mem_caches() freigegeben: $freed Bytes, Speicher: " . memory_get_usage() . " Bytes" . PHP_EOL;
}
// Nur 200 Iterationen für das Beispiel
if ($iteration >= 200) {
break;
}
}
echo "Worker beendet nach $iteration Iterationen." . PHP_EOL;
// Wichtig · Fallstricke
Hinweis zur Effektivität: Der tatsächliche Effekt von gc_mem_caches() hängt stark vom Kontext ab. Bei kurzlebigen Web-Requests ist der Nutzen vernachlässigbar, da PHP den gesamten Speicher am Ende des Requests freigibt. In langlaufenden Prozessen kann die Funktion hingegen spürbar zur Stabilisierung des Speicherverbrauchs beitragen.
Kombination mit Garbage Collector: Für maximale Wirkung sollte gc_mem_caches() nach gc_collect_cycles() aufgerufen werden, da der Garbage Collector zuerst zirkuläre Referenzen auflöst und dadurch zusätzliche interne Caches entstehen können, die anschließend von gc_mem_caches() freigegeben werden.
Performance: Der Aufruf ist nicht kostenlos – er verursacht einen gewissen Overhead, da interne Datenstrukturen der Engine traversiert werden müssen. Ein zu häufiger Aufruf (z. B. in jeder Iteration einer engen Schleife) kann die Performance negativ beeinflussen.