Signatur
Beschreibung
memory_reset_peak_usage() setzt den internen Zähler für den Spitzenwert der Speichernutzung auf den aktuell belegten Speicher zurück. Damit lässt sich der Speicherverbrauch eines bestimmten Codeabschnitts isoliert messen, ohne dass vorherige Spitzen aus früheren Phasen der Skriptausführung das Ergebnis verfälschen.
Die Funktion ist besonders nützlich in lang laufenden Skripten, Benchmarks oder bei der Profilerstellung einzelner Funktionen und Schleifen, wo man gezielt wissen möchte, wie viel zusätzlicher Speicher ein bestimmter Block benötigt. Vor der Einführung dieser Funktion war eine solche Isolierung nicht ohne weiteres möglich.
Die Funktion hat keinen Rückgabewert. Nach dem Aufruf liefert memory_get_peak_usage() zunächst denselben Wert wie memory_get_usage(), da der Spitzenwert auf den aktuellen Wert gesetzt wurde. Nachfolgende Speicherzuweisungen heben diesen neuen Spitzenwert dann an.
Zu beachten ist, dass die Funktion nur den von PHP intern gemessenen Spitzenwert beeinflusst und keine tatsächliche Speicherfreigabe bewirkt. Für eine korrekte Messung sollte man sicherstellen, dass nicht mehr benötigte Variablen vor dem Reset freigegeben werden.
Rückgabewert
Beispiele
Speicherverbrauch eines einzelnen Code-Blocks messen
<?php
// Vorbereitende Arbeit, die Speicher belegt
$data = range(1, 100000);
// Peak-Wert zurücksetzen, bevor der interessante Block beginnt
memory_reset_peak_usage();
$baseline = memory_get_usage();
// Zu messender Codeabschnitt
$result = array_map(fn(int $n) => $n ** 2, $data);
$peak = memory_get_peak_usage();
echo 'Spitzenspeicher für array_map: ' . number_format($peak - $baseline) . ' Bytes' . PHP_EOL;
// Aufräumen und nächsten Block messen
unset($result);
memory_reset_peak_usage();
$result2 = array_filter($data, fn(int $n) => $n % 2 === 0);
echo 'Spitzenspeicher für array_filter: ' . number_format(memory_get_peak_usage() - memory_get_usage() + memory_get_usage()) . ' Bytes' . PHP_EOL;
Benchmark-Vergleich zweier Implementierungen
<?php
function benchmarkMemory(callable $fn, string $label): void
{
// Sicherstellen, dass alter Peak-Wert nicht stört
memory_reset_peak_usage();
$before = memory_get_usage();
$fn();
$peak = memory_get_peak_usage();
printf("%s — Spitzenspeicher: %s Bytes, Delta: %s Bytes\n",
$label,
number_format($peak),
number_format($peak - $before)
);
}
benchmarkMemory(function () {
$arr = [];
for ($i = 0; $i < 10000; $i++) {
$arr[] = str_repeat('x', 100);
}
}, 'Array mit str_repeat');
benchmarkMemory(function () {
$arr = array_fill(0, 10000, str_repeat('y', 100));
}, 'array_fill');
// Wichtig · Fallstricke
Verfügbarkeit: Die Funktion ist erst ab PHP 8.2.0 verfügbar. In älteren PHP-Versionen gibt es keine direkte Entsprechung; dort musste man sich mit separaten Skripten oder Workarounds behelfen.
Kein echter Speicher-Reset: memory_reset_peak_usage() gibt keinen Speicher frei und hat keinen Einfluss auf das tatsächlich belegte RAM. Es wird lediglich der interne Messzähler zurückgesetzt. Zum Freigeben von Speicher sollten Variablen mit unset() gelöscht und ggf. gc_collect_cycles() aufgerufen werden.
Thread-Sicherheit: In einer Umgebung mit parallelen Threads (z. B. mit der parallel-Extension) gilt der Peak-Speicher pro Thread/Context. Der Reset wirkt sich nur auf den aktuellen Ausführungskontext aus.