Start · Sprachen · PHP · Referenz · pcntl_setqos_class

pcntl_setqos_class

Funktion

Setzt die QoS-Klasse (Quality of Service) des aktuellen Threads unter macOS, um die Scheduling-Priorität des Prozesses zu steuern.

seit PHP 8.4.0 Kategorie: misc

Signatur

pcntl_setqos_class(int $qos_class): bool

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

Typ
bool
Beschreibung
Gibt 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;
}
QoS-Klasse erfolgreich auf BACKGROUND gesetzt. Hintergrundarbeit abgeschlossen.

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;
}
Eltern-Prozess: Läuft mit USER_INTERACTIVE-Priorität. Kind-Prozess: Läuft mit BACKGROUND-Priorität. Kind-Prozess beendet.

// 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.