Start · Sprachen · PHP · Referenz · getrusage

getrusage

Funktion

Gibt die aktuelle Ressourcenauslastung des Prozesses als assoziatives Array zurück (CPU-Zeit, Speicher, Kontextwechsel u. a.).

seit PHP 4.0.0 Kategorie: misc

Signatur

getrusage(int $mode = 0): array|false

Beschreibung

getrusage() ruft Betriebssystem-Informationen über den Ressourcenverbrauch des aktuellen PHP-Prozesses ab. Die zurückgegebenen Werte stammen direkt vom Unix-Systemaufruf getrusage(2) und umfassen u. a. die verbrauchte CPU-Zeit (User- und Kernel-Modus), die Anzahl der Kontextwechsel sowie Paging-Informationen.

Typische Einsatzgebiete sind Performance-Messungen, Profiling von rechenintensiven Skripten und die Überwachung des Ressourcenverbrauchs in Produktionsumgebungen. Mit den Feldern ru_utime.tv_sec/ru_utime.tv_usec (User-CPU) und ru_stime.tv_sec/ru_stime.tv_usec (System-CPU) lässt sich die genaue CPU-Zeit berechnen.

Mit dem Parameter mode = 1 werden statt der eigenen Werte die Werte der Kind-Prozesse abgefragt. Auf Windows-Systemen werden nur die Felder ru_utime.tv_sec, ru_utime.tv_usec, ru_stime.tv_sec und ru_stime.tv_usec befüllt; alle anderen Felder enthalten 0.

Parameter

Name Typ Default Beschreibung
$mode int 0 Steuert, welche Ressourcen abgefragt werden: 0 (Standard) = aktueller Prozess, 1 = Kind-Prozesse (RUSAGE_CHILDREN). Auf einigen Systemen ist zusätzlich 2 (RUSAGE_THREAD) verfügbar.

Rückgabewert

Typ
array|false
Beschreibung
Ein assoziatives Array mit Ressourcen-Informationen wie ru_utime.tv_sec, ru_utime.tv_usec, ru_stime.tv_sec, ru_stime.tv_usec, ru_maxrss, ru_ixrss, ru_idrss, ru_minflt, ru_majflt, ru_nswap, ru_inblock, ru_oublock, ru_msgsnd, ru_msgrcv, ru_nsignals, ru_nvcsw, ru_nivcsw. Gibt false zurück, wenn ein Fehler auftritt.

Beispiele

CPU-Zeit eines Skripts messen

<?php
$start = getrusage();

// Simulierte rechenintensive Aufgabe
$sum = 0;
for ($i = 0; $i < 5_000_000; $i++) {
    $sum += $i;
}

$end = getrusage();

$userSec  = ($end['ru_utime.tv_sec']  - $start['ru_utime.tv_sec'])
          + ($end['ru_utime.tv_usec'] - $start['ru_utime.tv_usec']) / 1_000_000;
$sysSec   = ($end['ru_stime.tv_sec']  - $start['ru_stime.tv_sec'])
          + ($end['ru_stime.tv_usec'] - $start['ru_stime.tv_usec']) / 1_000_000;

printf("User-CPU:   %.4f s\n", $userSec);
printf("System-CPU: %.4f s\n", $sysSec);
User-CPU: 0.0312 s System-CPU: 0.0000 s

Alle verfügbaren Ressourcen-Felder ausgeben

<?php
$usage = getrusage();

foreach ($usage as $key => $value) {
    printf("%-25s = %d\n", $key, $value);
}
ru_utime.tv_sec = 0 ru_utime.tv_usec = 1234 ru_stime.tv_sec = 0 ru_stime.tv_usec = 567 ru_maxrss = 8192 ...

Kind-Prozess-Ressourcen abfragen

<?php
// Kind-Prozess starten und warten
$pid = pcntl_fork();
if ($pid === 0) {
    // Kind-Prozess: rechenintensiv
    $s = 0;
    for ($i = 0; $i < 1_000_000; $i++) { $s += $i; }
    exit(0);
} else {
    pcntl_wait($status); // auf Kind warten
    $childUsage = getrusage(1); // RUSAGE_CHILDREN
    printf("Kind User-CPU: %d.%06d s\n",
        $childUsage['ru_utime.tv_sec'],
        $childUsage['ru_utime.tv_usec']
    );
}
Kind User-CPU: 0.004512 s

// Wichtig · Fallstricke

Plattformabhängigkeit: Auf Windows werden die meisten Felder als 0 zurückgegeben; nur die vier Zeitfelder sind befüllt. Die genaue Bedeutung und Verfügbarkeit der Felder hängt vom Betriebssystem ab – konsultieren Sie im Zweifel die Manpage getrusage(2).

Einheit: Die ru_maxrss-Angabe ist auf Linux in Kilobytes, auf macOS/BSD in Bytes – Vorsicht beim plattformübergreifenden Einsatz.

getrusage() misst den kumulierten Verbrauch seit Prozessstart. Für präzise Laufzeitmessungen innerhalb eines Skripts empfiehlt sich die Differenzbildung zweier Aufrufe (siehe erstes Beispiel).