Start · Sprachen · PHP · Referenz · LuaSandboxTimeoutError

LuaSandboxTimeoutError

Klasse

Repräsentiert einen Fehler, der ausgelöst wird, wenn ein Lua-Skript in der <code>LuaSandbox</code> das festgelegte Zeitlimit überschreitet.

Kategorie: error

Signatur

class LuaSandboxTimeoutError extends LuaSandboxError

Beschreibung

LuaSandboxTimeoutError ist eine Ausnahme-Klasse aus der LuaSandbox-Erweiterung und wird geworfen, wenn ein in der Sandbox ausgeführtes Lua-Skript die maximal zulässige CPU- oder Echtzeit-Ausführungszeit überschreitet. Sie erbt von LuaSandboxError und damit letztlich von Exception.

Die Zeitlimits werden über die Methoden LuaSandbox::setCPULimit() und LuaSandbox::setWallClockLimit() gesetzt. Sobald ein Limit überschritten wird, bricht die Sandbox die Ausführung des Lua-Codes sofort ab und wirft eine LuaSandboxTimeoutError-Exception.

Diese Klasse ist besonders nützlich, um in produktiven Systemen sicherzustellen, dass benutzergenerierter oder nicht vertrauenswürdiger Lua-Code keine unbegrenzte Rechenzeit beansprucht. Durch das Abfangen dieser Exception kann das System kontrolliert auf eine Zeitüberschreitung reagieren, anstatt dass der PHP-Prozess hängt oder ein globales Timeout greift.

Da LuaSandboxTimeoutError von LuaSandboxError erbt, kann sie entweder gezielt oder gemeinsam mit anderen Sandbox-Fehlern in einem catch-Block behandelt werden.

Beispiele

Zeitüberschreitung eines Lua-Skripts abfangen

<?php
// LuaSandbox-Erweiterung muss installiert sein
$sandbox = new LuaSandbox();

// CPU-Limit auf 1 Sekunde setzen
$sandbox->setCPULimit(1.0);

try {
    // Endlosschleife in Lua – wird nach 1 Sekunde unterbrochen
    $sandbox->loadString('while true do end')->call();
} catch (LuaSandboxTimeoutError $e) {
    echo 'Zeitüberschreitung: ' . $e->getMessage() . PHP_EOL;
} catch (LuaSandboxError $e) {
    echo 'Allgemeiner Sandbox-Fehler: ' . $e->getMessage() . PHP_EOL;
}
Zeitüberschreitung: The maximum execution time for this script has been exceeded

Wanduhr-Limit (Wall-Clock) und CPU-Limit kombinieren

<?php
$sandbox = new LuaSandbox();

// CPU-Limit: 2 Sekunden, Wanduhr-Limit: 5 Sekunden
$sandbox->setCPULimit(2.0);
$sandbox->setWallClockLimit(5.0);

$luaCode = '
    local x = 0
    for i = 1, math.huge do
        x = x + i
    end
    return x
';

try {
    $result = $sandbox->loadString($luaCode)->call();
    echo 'Ergebnis: ' . $result[0] . PHP_EOL;
} catch (LuaSandboxTimeoutError $e) {
    // Kontrolliertes Reagieren auf Zeitüberschreitung
    echo 'Das Lua-Skript hat das Zeitlimit überschritten.' . PHP_EOL;
    echo 'Nachricht: ' . $e->getMessage() . PHP_EOL;
}
Das Lua-Skript hat das Zeitlimit überschritten. Nachricht: The maximum execution time for this script has been exceeded

// Wichtig · Fallstricke

Sicherheitshinweis: Beim Ausführen von nicht vertrauenswürdigem Lua-Code sollte immer ein CPU- und/oder Wanduhr-Limit gesetzt werden, um Denial-of-Service-Angriffe durch absichtlich langsame oder endlos laufende Skripte zu verhindern. Das alleinige Verlassen auf PHP-eigene Timeouts ist nicht ausreichend, da diese unter Umständen nicht greifen oder den gesamten Prozess betreffen.

Hinweis zur Erweiterung: LuaSandboxTimeoutError steht nur zur Verfügung, wenn die LuaSandbox-PECL-Erweiterung installiert und aktiviert ist. Diese ist nicht Bestandteil der PHP-Standardinstallation und wird vor allem in Projekten wie MediaWiki eingesetzt.

Nach einer LuaSandboxTimeoutError-Exception ist der Zustand der Sandbox undefiniert. Es wird empfohlen, die Sandbox-Instanz zu verwerfen und bei Bedarf eine neue zu erstellen.