Start · Sprachen · PHP · Referenz · pcntl_getcpuaffinity

pcntl_getcpuaffinity

Funktion

Liefert die Menge der CPU-Kerne, auf denen ein Prozess ausgeführt werden darf (CPU-Affinität).

seit PHP 8.4.0 Kategorie: misc

Signatur

pcntl_getcpuaffinity(int $process_id = 0): array|false

Beschreibung

pcntl_getcpuaffinity() gibt die CPU-Affinitätsmaske eines Prozesses als Array von CPU-Kern-Indizes zurück. Die CPU-Affinität legt fest, auf welchen logischen Prozessoren (Kernen) ein Prozess vom Betriebssystem eingeplant werden darf. Dies ist nützlich für Performance-Optimierungen, NUMA-Architekturen oder zur Isolation von rechenintensiven Prozessen auf bestimmte Kerne.

Wird 0 als process_id übergeben (Standardwert), bezieht sich die Abfrage auf den aktuellen Prozess. Andernfalls kann die PID eines beliebigen Prozesses angegeben werden, für den der aufrufende Prozess die nötigen Berechtigungen besitzt.

Das zurückgegebene Array enthält die nullbasierten Indizes der Kerne, auf denen der Prozess laufen darf, z. B. [0, 1, 2, 3] für die ersten vier Kerne eines Systems. Diese Funktion ist nur auf Linux-Systemen verfügbar, da sie intern auf sched_getaffinity() aufsetzt.

In Kombination mit pcntl_setcpuaffinity() lässt sich die CPU-Bindung von Worker-Prozessen in Multi-Process-Anwendungen gezielt steuern, etwa um Cache-Thrashing zu vermeiden oder Echtzeit-Anforderungen zu erfüllen.

Parameter

Name Typ Default Beschreibung
$process_id int 0 Die PID des Prozesses, dessen CPU-Affinität abgefragt werden soll. 0 steht für den aktuell laufenden Prozess.

Rückgabewert

Typ
array|false
Beschreibung
Gibt ein Array mit den nullbasierten Indizes der erlaubten CPU-Kerne zurück, z. B. [0, 1, 2, 3]. Im Fehlerfall (z. B. unzureichende Berechtigungen oder ungültige PID) wird false zurückgegeben.

Beispiele

CPU-Affinität des aktuellen Prozesses abfragen

<?php
// Ermittelt die CPU-Kerne, auf denen der aktuelle PHP-Prozess laufen darf
$affinity = pcntl_getcpuaffinity();

if ($affinity === false) {
    echo "Fehler beim Abrufen der CPU-Affinität." . PHP_EOL;
} else {
    echo "Erlaubte CPU-Kerne: " . implode(', ', $affinity) . PHP_EOL;
    echo "Anzahl erlaubter Kerne: " . count($affinity) . PHP_EOL;
}
Erlaubte CPU-Kerne: 0, 1, 2, 3 Anzahl erlaubter Kerne: 4

CPU-Affinität eines Kind-Prozesses prüfen und einschränken

<?php
// Erzeugt einen Kind-Prozess, schränkt dessen CPU-Affinität ein
// und liest sie anschließend aus
$pid = pcntl_fork();

if ($pid === -1) {
    die("Fork fehlgeschlagen");
} elseif ($pid === 0) {
    // Kind-Prozess: nur auf Kern 0 und 1 beschränken
    $result = pcntl_setcpuaffinity(0, [0, 1]);
    if ($result === false) {
        echo "Setzen der Affinität fehlgeschlagen." . PHP_EOL;
        exit(1);
    }

    $affinity = pcntl_getcpuaffinity();
    echo "Kind-Prozess darf auf Kernen laufen: " . implode(', ', $affinity) . PHP_EOL;
    exit(0);
} else {
    // Eltern-Prozess wartet auf Kind
    pcntl_waitpid($pid, $status);

    $parentAffinity = pcntl_getcpuaffinity();
    echo "Eltern-Prozess darf auf Kernen laufen: " . implode(', ', $parentAffinity) . PHP_EOL;
}
Kind-Prozess darf auf Kernen laufen: 0, 1 Eltern-Prozess darf auf Kernen laufen: 0, 1, 2, 3

// Wichtig · Fallstricke

Plattformeinschränkung: pcntl_getcpuaffinity() ist ausschließlich auf Linux verfügbar, da es auf dem Linux-Systemaufruf sched_getaffinity() basiert. Auf macOS, Windows oder anderen Betriebssystemen steht die Funktion nicht zur Verfügung.

Berechtigungen: Das Abfragen der CPU-Affinität eines fremden Prozesses erfordert entsprechende Betriebssystem-Berechtigungen (in der Regel Root oder CAP_SYS_NICE). Für den eigenen Prozess sind keine erhöhten Rechte nötig.

Verfügbarkeit: Die Funktion wurde in PHP 8.4.0 eingeführt. Die Erweiterung pcntl muss beim Kompilieren aktiviert worden sein und steht typischerweise nur in CLI-Skripten oder Daemon-Prozessen zur Verfügung — nicht in PHP-FPM oder mod_php.