Start · Sprachen · PHP · Referenz · posix_setrlimit

posix_setrlimit

Funktion

Setzt das Soft- und Hard-Limit für eine bestimmte Systemressource des aktuellen Prozesses.

seit PHP 7.0.0 Kategorie: misc

Signatur

posix_setrlimit(int $resource, int $softlimit, int $hardlimit): bool

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

Typ
bool
Beschreibung
Gibt 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;
Datei-Limit erfolgreich gesetzt.

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
}
CPU-Limit gesetzt: Soft=10s, Hard=15s

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