Signatur
Beschreibung
posix_setrlimit() setzt die Ressourcenlimits für den laufenden PHP-Prozess mithilfe des POSIX-Systemaufrufs setrlimit(). Ressourcenlimits steuern, wie viel eines bestimmten Systemgutes (z. B. CPU-Zeit, Dateigröße, Anzahl offener Dateien) ein Prozess verbrauchen darf.
Jede Ressource hat ein Soft-Limit und ein Hard-Limit. Das Soft-Limit ist der tatsächlich durchgesetzte Wert; das Hard-Limit ist die Obergrenze, bis zu der ein unprivilegierter Prozess sein Soft-Limit anheben darf. Nur ein Prozess mit dem Recht CAP_SYS_RESOURCE (bzw. Root-Rechten) darf das Hard-Limit erhöhen.
Die Ressource wird als eine der vordefinierten Konstanten übergeben, z. B. POSIX_RLIMIT_NOFILE (Anzahl offener Dateien), POSIX_RLIMIT_AS (virtueller Adressraum) oder POSIX_RLIMIT_CPU (CPU-Zeit in Sekunden). Für beide Limits kann die Sonderkonstante POSIX_RLIMIT_INFINITY übergeben werden, um kein Limit zu setzen.
Die Funktion ist besonders nützlich in Daemon-Prozessen oder CLI-Skripten, die bestimmte Sicherheits- oder Stabilitätsgrenzen einhalten sollen, beispielsweise um unkontrollierten Speicherverbrauch oder endlose CPU-Auslastung zu verhindern.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $resource Pflicht | int | Die zu begrenzende Systemressource. Muss eine der POSIX_RLIMIT_*-Konstanten sein, z. B. POSIX_RLIMIT_NOFILE, POSIX_RLIMIT_AS, POSIX_RLIMIT_CPU usw. |
|
| $softlimit Pflicht | int | Das neue Soft-Limit für die Ressource. Der Wert muss kleiner oder gleich dem Hard-Limit sein. Verwende POSIX_RLIMIT_INFINITY für kein Limit. |
|
| $hardlimit Pflicht | int | Das neue Hard-Limit für die Ressource. Kann nur von privilegierten Prozessen erhöht werden. Verwende POSIX_RLIMIT_INFINITY für kein Limit. |
Rückgabewert
true zurück, wenn das Limit erfolgreich gesetzt wurde, andernfalls false. Im Fehlerfall liefert posix_get_last_error() bzw. posix_strerror() weitere Informationen.Beispiele
Maximale Anzahl offener Dateien begrenzen
<?php
// Soft-Limit: 256, Hard-Limit: 512 offene Dateien
$result = posix_setrlimit(POSIX_RLIMIT_NOFILE, 256, 512);
if ($result) {
echo "Datei-Limit erfolgreich gesetzt." . PHP_EOL;
} else {
$errno = posix_get_last_error();
echo "Fehler: " . posix_strerror($errno) . PHP_EOL;
}
// Aktuellen Wert zur Kontrolle auslesen
$limits = posix_getrlimit();
echo "Soft-Limit: " . $limits['soft filesize'] . PHP_EOL;
echo "Hard-Limit: " . $limits['hard filesize'] . PHP_EOL;
CPU-Zeit auf 10 Sekunden begrenzen (Daemon-Absicherung)
<?php
// Prozess darf maximal 10 Sekunden CPU-Zeit (Soft) bzw. 15 Sekunden (Hard) verbrauchen
if (posix_setrlimit(POSIX_RLIMIT_CPU, 10, 15)) {
echo "CPU-Limit gesetzt: Soft=10s, Hard=15s" . PHP_EOL;
} else {
echo "Fehler beim Setzen des CPU-Limits: "
. posix_strerror(posix_get_last_error()) . PHP_EOL;
}
// Simulierter rechenintensiver Vorgang
$start = time();
while (true) {
// Wird nach Überschreiten des CPU-Limits mit SIGXCPU beendet
$x = sqrt(rand(1, PHP_INT_MAX));
if (time() - $start > 12) break; // Sicherheitsstopper im Beispiel
}
// Wichtig · Fallstricke
Plattformunterstützung: posix_setrlimit() steht nur auf POSIX-kompatiblen Systemen (Linux, macOS, BSD) zur Verfügung. Unter Windows ist die Funktion nicht vorhanden.
Berechtigungen: Das Erhöhen eines Hard-Limits erfordert Root-Rechte oder die Linux-Capability CAP_SYS_RESOURCE. Unprivilegierte Prozesse können ihr Hard-Limit nur verringern (irreversibel in der Sitzung) oder ihr Soft-Limit bis zum aktuellen Hard-Limit erhöhen.
Erweiterung: Die Funktion gehört zur posix-Erweiterung, die möglicherweise nicht in allen PHP-Builds aktiviert ist. Prüfe die Verfügbarkeit mit function_exists('posix_setrlimit').
Zusammenspiel mit posix_getrlimit(): Lies vor dem Setzen stets die aktuellen Limits aus, um sicherzustellen, dass du das Hard-Limit nicht unbeabsichtigt überschreitest.