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