Start · Sprachen · PHP · Referenz · memory_get_peak_usage

memory_get_peak_usage

Funktion

Gibt die maximale Speichermenge zurück, die PHP während der aktuellen Skript-Ausführung belegt hat.

seit PHP 5.2.0 Kategorie: misc

Signatur

memory_get_peak_usage(bool $real_usage = false): int

Beschreibung

memory_get_peak_usage() liefert den höchsten Speicherverbrauch, den das PHP-Skript seit seinem Start erreicht hat. Dies ist besonders nützlich für die Leistungsanalyse und das Aufspüren von Speicherlecks, da man so erkennt, an welcher Stelle im Skript der Speicherbedarf seinen Spitzenwert erreicht.

Der Parameter real_usage steuert, ob der tatsächlich vom Betriebssystem angeforderte Speicher (true) oder nur der intern von PHP tatsächlich genutzte Speicher (false) zurückgegeben wird. Der intern gemessene Wert ist in der Regel kleiner, da PHP Speicher in Blöcken vom OS anfordert und intern verwaltet.

Der Rückgabewert wird in Bytes angegeben. Um ihn lesbarer darzustellen, kann man ihn durch 1024 dividieren (Kilobytes) oder 1048576 (Megabytes). Diese Funktion ist ideal, um am Ende eines Skripts einen Bericht über den Spitzen-Speicherbedarf auszugeben, beispielsweise in Logging- oder Profiling-Systemen.

Im Gegensatz zu memory_get_usage(), das den aktuellen Speicherverbrauch misst, erfasst memory_get_peak_usage() den maximalen Verbrauch über die gesamte Laufzeit — selbst wenn zwischenzeitlich Speicher wieder freigegeben wurde.

Parameter

Name Typ Default Beschreibung
$real_usage bool false Wenn true, wird der tatsächlich vom Betriebssystem reservierte Speicher zurückgegeben. Bei false (Standard) wird der von der PHP-internen Speicherverwaltung gemessene Verbrauch zurückgegeben, der in der Regel etwas geringer ausfällt.

Rückgabewert

Typ
int
Beschreibung
Die maximale Speichermenge in Bytes, die das Skript seit seinem Start belegt hat. Der Wert hängt vom Parameter real_usage ab.

Beispiele

Spitzen-Speicherverbrauch am Skript-Ende ausgeben

<?php
// Speicherintensive Operation simulieren
$data = [];
for ($i = 0; $i < 100000; $i++) {
    $data[] = str_repeat('x', 100);
}

// Daten wieder freigeben
unset($data);

// Trotz unset: peak usage zeigt den höchsten Wert
$peakBytes = memory_get_peak_usage();
$peakMB    = round($peakBytes / 1048576, 2);

echo "Spitzen-Speicherverbrauch (intern): {$peakMB} MB" . PHP_EOL;

$peakBytesReal = memory_get_peak_usage(true);
$peakMBReal    = round($peakBytesReal / 1048576, 2);

echo "Spitzen-Speicherverbrauch (OS):    {$peakMBReal} MB" . PHP_EOL;
Spitzen-Speicherverbrauch (intern): 11.43 MB Spitzen-Speicherverbrauch (OS): 12.00 MB

Speicherverbrauch in einem einfachen Profiler loggen

<?php
function formatBytes(int $bytes): string {
    return round($bytes / 1048576, 3) . ' MB';
}

function runTask(): void {
    // Simulierter Speicherverbrauch
    $tmp = array_fill(0, 50000, 'PHP-Profiling-Demo');
    // $tmp wird am Ende der Funktion freigegeben
}

$startMemory = memory_get_usage();

runTask();

$endMemory  = memory_get_usage();
$peakMemory = memory_get_peak_usage();

echo 'Speicher vor Task:  ' . formatBytes($startMemory) . PHP_EOL;
echo 'Speicher nach Task: ' . formatBytes($endMemory)   . PHP_EOL;
echo 'Spitzenwert:        ' . formatBytes($peakMemory)  . PHP_EOL;
Speicher vor Task: 0.421 MB Speicher nach Task: 0.421 MB Spitzenwert: 5.234 MB

// Wichtig · Fallstricke

Hinweis zur Zuverlässigkeit: Der zurückgegebene Spitzenwert wird seit dem Start des PHP-Prozesses gemessen. Wird das Skript im Kontext eines lang laufenden PHP-Prozesses (z. B. PHP-FPM) ausgeführt, sollte beachtet werden, dass der Peak-Wert aus früheren Anfragen stammen kann, wenn der Prozess Speicher nicht vollständig zurückgibt.

Konfiguration: Die Funktion wird durch die memory_limit-Direktive in der php.ini beeinflusst. Überschreitet das Skript dieses Limit, bricht PHP mit einem fatalen Fehler ab, bevor memory_get_peak_usage() am Ende aufgerufen werden kann — daher empfiehlt es sich, die Funktion ggf. auch zwischendurch aufzurufen.

Um präzise Aussagen über den Speicherverbrauch zu erhalten, sollte man beide Varianten (real_usage = false und real_usage = true) vergleichen.