Signatur
Beschreibung
pcntl_setqos_class() ermöglicht es, die QoS-Klasse (Quality of Service) des aktuellen Threads zu setzen. Diese Funktion steht nur auf macOS zur Verfügung und nutzt das Apple-eigene Grand Central Dispatch (GCD) QoS-System, das dem Betriebssystem mitteilt, wie wichtig die Arbeit des Threads im Vergleich zu anderen Prozessen ist.
QoS-Klassen erlauben eine feingranulare Steuerung der CPU- und I/O-Ressourcenzuteilung. Ein Hintergrund-Job kann beispielsweise mit PCNTL_QOS_CLASS_BACKGROUND markiert werden, damit er das System nicht überlastet, während interaktive Prozesse mit PCNTL_QOS_CLASS_USER_INTERACTIVE bevorzugt behandelt werden.
Typische Anwendungsfälle sind CLI-Skripte, die rechenintensive Aufgaben wie Bildverarbeitung, Datenbankmigrationen oder Backups im Hintergrund ausführen und dabei die Reaktionsfähigkeit des restlichen Systems nicht beeinträchtigen sollen.
Die verfügbaren QoS-Klassen-Konstanten sind: PCNTL_QOS_CLASS_USER_INTERACTIVE, PCNTL_QOS_CLASS_USER_INITIATED, PCNTL_QOS_CLASS_DEFAULT, PCNTL_QOS_CLASS_UTILITY und PCNTL_QOS_CLASS_BACKGROUND.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $qos_class Pflicht | int | Eine der vordefinierten QoS-Klassen-Konstanten: PCNTL_QOS_CLASS_USER_INTERACTIVE, PCNTL_QOS_CLASS_USER_INITIATED, PCNTL_QOS_CLASS_DEFAULT, PCNTL_QOS_CLASS_UTILITY oder PCNTL_QOS_CLASS_BACKGROUND. |
Rückgabewert
true zurück, wenn die QoS-Klasse erfolgreich gesetzt wurde, andernfalls false (z. B. wenn die Funktion nicht auf dem aktuellen Betriebssystem unterstützt wird oder ein ungültiger Wert übergeben wurde).Beispiele
Hintergrundprozess mit niedriger QoS-Klasse
<?php
// Setzt den aktuellen Thread auf die niedrigste Priorität (Hintergrundarbeit)
if (pcntl_setqos_class(PCNTL_QOS_CLASS_BACKGROUND)) {
echo "QoS-Klasse erfolgreich auf BACKGROUND gesetzt." . PHP_EOL;
// Ressourcenintensive Aufgabe, die das System nicht belasten soll
for ($i = 0; $i < 1000000; $i++) {
// Simulierte Hintergrundarbeit
}
echo "Hintergrundarbeit abgeschlossen." . PHP_EOL;
} else {
echo "Fehler: QoS-Klasse konnte nicht gesetzt werden." . PHP_EOL;
}
Forked-Prozess mit unterschiedlichen QoS-Klassen
<?php
$pid = pcntl_fork();
if ($pid === -1) {
die('Fork fehlgeschlagen');
} elseif ($pid === 0) {
// Kindprozess: Hintergrundaufgabe mit niedrigster Priorität
pcntl_setqos_class(PCNTL_QOS_CLASS_BACKGROUND);
echo "Kind-Prozess: Läuft mit BACKGROUND-Priorität." . PHP_EOL;
sleep(2);
exit(0);
} else {
// Elternprozess: Interaktive Aufgabe mit hoher Priorität
pcntl_setqos_class(PCNTL_QOS_CLASS_USER_INTERACTIVE);
echo "Eltern-Prozess: Läuft mit USER_INTERACTIVE-Priorität." . PHP_EOL;
pcntl_waitpid($pid, $status);
echo "Kind-Prozess beendet." . PHP_EOL;
}
// Wichtig · Fallstricke
Plattformabhängigkeit: pcntl_setqos_class() ist ausschließlich auf macOS verfügbar und wird auf Linux oder Windows nicht unterstützt. Vor dem Aufruf sollte mit defined('PCNTL_QOS_CLASS_DEFAULT') geprüft werden, ob die Konstanten überhaupt vorhanden sind.
Verfügbarkeit der Erweiterung: Die Funktion setzt voraus, dass die pcntl-Erweiterung kompiliert und aktiviert ist. Sie steht nur in CLI-Skripten zur Verfügung und sollte nicht in Web-Server-Kontexten verwendet werden.