Signatur
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
[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;
}
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;
}
// 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.