Start · Sprachen · PHP · Referenz · gc_mem_caches

gc_mem_caches

Funktion

Gibt vom internen Speichermanager der Zend Engine gecachten Speicher frei und liefert die Anzahl der freigegebenen Bytes zurück.

seit PHP 7.0.0 Kategorie: misc

Signatur

gc_mem_caches(): int

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

Typ
int
Beschreibung
Gibt die Anzahl der freigegebenen Bytes als 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;
Freigegebene Bytes durch gc_mem_caches(): 524288 Aktueller Speicherverbrauch: 2097152 Bytes

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;
[Iteration 100] gc_mem_caches() freigegeben: 0 Bytes, Speicher: 423456 Bytes [Iteration 200] gc_mem_caches() freigegeben: 0 Bytes, Speicher: 423456 Bytes Worker beendet nach 200 Iterationen.

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