Start · Sprachen · PHP · Referenz · pcntl_setpriority

pcntl_setpriority

Funktion

Ändert die Scheduling-Priorität (Nice-Wert) eines Prozesses, Prozessgruppe oder Benutzers unter Unix/Linux.

seit PHP 5.0.0 Kategorie: misc

Signatur

pcntl_setpriority(int $priority, int $process_id = 0, int $process_identifier = PRIO_PROCESS): bool

Beschreibung

pcntl_setpriority() setzt den sogenannten Nice-Wert eines Prozesses. Niedrigere Werte bedeuten höhere Priorität (Bereich typischerweise -20 bis +20 unter Linux). Normalerweise kann ein unprivilegierter Benutzer die Priorität nur verringern (also den Nice-Wert erhöhen), während das Erhöhen der Priorität (Nice-Wert senken) Root-Rechte erfordert.

Der zu beeinflussende Prozess wird über den Parameter process_id identifiziert, wobei der Typ (Prozess, Prozessgruppe oder Benutzer) über process_identifier gesteuert wird. Wird process_id auf 0 gesetzt, bezieht sich der Aufruf auf den aufrufenden Prozess selbst.

Diese Funktion ist besonders nützlich in Daemon-Prozessen oder parallelen Worker-Szenarien, in denen einzelne Kind-Prozesse (erstellt mit pcntl_fork()) unterschiedliche Prioritäten erhalten sollen – etwa um ressourcenintensive Hintergrundtasks nicht die interaktive Verarbeitung blockieren zu lassen.

Die Funktion steht nur auf Unix-ähnlichen Betriebssystemen zur Verfügung und ist nicht unter Windows nutzbar. Sie erfordert, dass PHP mit der pcntl-Erweiterung kompiliert wurde.

Parameter

Name Typ Default Beschreibung
$priority Pflicht int Der neue Nice-Wert des Prozesses. Typischer Bereich: -20 (höchste Priorität) bis +20 (niedrigste Priorität). Negative Werte erfordern in der Regel Root-Rechte.
$process_id int 0 Die Prozess-ID, Prozessgruppen-ID oder Benutzer-ID, deren Priorität geändert werden soll. Bei 0 wird der aktuell aufrufende Prozess verwendet.
$process_identifier int PRIO_PROCESS Gibt an, wie process_id interpretiert wird. Mögliche Werte: PRIO_PROCESS (Prozess-ID), PRIO_PGRP (Prozessgruppen-ID) oder PRIO_USER (Benutzer-ID).

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn die Priorität erfolgreich gesetzt wurde. Gibt false zurück, wenn ein Fehler aufgetreten ist – etwa weil der Prozess nicht gefunden wurde oder die nötigen Berechtigungen fehlen.

Beispiele

Priorität des aktuellen Prozesses herabsetzen

<?php
// Aktuellen Prozess auf niedrigere Priorität setzen (Nice-Wert erhöhen)
$result = pcntl_setpriority(10);

if ($result) {
    echo "Priorität erfolgreich auf 10 (niedrig) gesetzt.\n";
} else {
    echo "Fehler beim Setzen der Priorität.\n";
}

// Aktuelle Priorität zur Kontrolle auslesen
$currentPriority = pcntl_getpriority();
echo "Aktuelle Priorität: " . $currentPriority . "\n";
Priorität erfolgreich auf 10 (niedrig) gesetzt. Aktuelle Priorität: 10

Kind-Prozess mit niedriger Priorität für Hintergrundarbeit

<?php
$pid = pcntl_fork();

if ($pid === -1) {
    die("Fork fehlgeschlagen\n");
} elseif ($pid === 0) {
    // Kind-Prozess: niedrige Priorität setzen, um Elternprozess nicht zu bremsen
    if (pcntl_setpriority(15, 0, PRIO_PROCESS)) {
        echo "Kind-Prozess (PID: " . posix_getpid() . ") läuft mit niedriger Priorität (15).\n";
    } else {
        echo "Konnte Priorität nicht setzen.\n";
    }

    // Simulierte Hintergrundarbeit
    sleep(2);
    exit(0);
} else {
    // Elternprozess wartet
    echo "Elternprozess (PID: " . posix_getpid() . ") wartet auf Kind $pid...\n";
    pcntl_wait($status);
    echo "Kind-Prozess beendet.\n";
}
Elternprozess (PID: 1234) wartet auf Kind 1235... Kind-Prozess (PID: 1235) läuft mit niedriger Priorität (15). Kind-Prozess beendet.

// Wichtig · Fallstricke

Betriebssystem-Abhängigkeit: pcntl_setpriority() ist nur auf Unix-ähnlichen Systemen (Linux, macOS, BSD) verfügbar. Unter Windows steht die Funktion nicht zur Verfügung.

Berechtigungen: Das Erhöhen der Prozesspriorität (also das Senken des Nice-Werts unter den aktuellen Wert oder unter 0) erfordert unter Linux Root-Rechte (CAP_SYS_NICE). Schlägt der Aufruf fehl, kann pcntl_errno() und pcntl_strerror() für detaillierte Fehlerinformationen genutzt werden.

Achtung bei PRIO_USER: Wird PRIO_USER als process_identifier verwendet, wirkt sich die Änderung auf alle Prozesse des angegebenen Benutzers aus – dies sollte mit Bedacht eingesetzt werden.