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