Signatur
Beschreibung
LuaSandboxFatalError ist eine Ausnahme-Klasse der LuaSandbox-Erweiterung und wird geworfen, wenn innerhalb der Lua-Sandbox ein fataler, nicht behebbarer Fehler auftritt. Solche Fehler können z. B. durch Speicherlimitüberschreitungen, Zeitüberschreitungen oder interne Sandbox-Fehler entstehen.
Im Gegensatz zu LuaSandboxRuntimeError, der für normale Lua-Laufzeitfehler steht, signalisiert LuaSandboxFatalError, dass der Zustand der Sandbox nicht mehr sicher ist und die betroffene LuaSandbox-Instanz nicht weiterverwendet werden sollte. Nach dem Abfangen dieses Fehlers ist es ratsam, die Sandbox-Instanz zu verwerfen und ggf. neu zu erstellen.
LuaSandboxFatalError erbt von LuaSandboxError, welche wiederum von Exception erbt. Dadurch stehen alle Standard-Methoden wie getMessage(), getCode() und getTrace() zur Verfügung.
Dieser Fehlertyp tritt typischerweise in Umgebungen auf, in denen Lua-Skripte mit Ressourcenbeschränkungen (Speicher, CPU-Zeit) ausgeführt werden, wie etwa in MediaWiki-Erweiterungen.
Beispiele
Fatalen Lua-Sandbox-Fehler abfangen
<?php
try {
$sandbox = new LuaSandbox();
// Speicherlimit sehr niedrig setzen, um einen fatalen Fehler zu provozieren
$sandbox->setMemoryLimit(1); // 1 Byte — führt zu einem fatalen Fehler
$sandbox->loadString('return string.rep("x", 100000)')->call();
} catch (LuaSandboxFatalError $e) {
// Fataler Fehler: Sandbox-Instanz nicht mehr verwenden
echo 'Fataler Sandbox-Fehler: ' . $e->getMessage() . PHP_EOL;
echo 'Die Sandbox-Instanz muss verworfen werden.' . PHP_EOL;
unset($sandbox);
} catch (LuaSandboxError $e) {
echo 'Allgemeiner Sandbox-Fehler: ' . $e->getMessage() . PHP_EOL;
}
Unterscheidung zwischen fatalen und normalen Sandbox-Fehlern
<?php
function executeLua(LuaSandbox $sandbox, string $code): mixed {
try {
$func = $sandbox->loadString($code);
[$result] = $func->call();
return $result;
} catch (LuaSandboxFatalError $e) {
// Fataler Fehler — Sandbox unbrauchbar
throw new RuntimeException(
'Fataler Sandbox-Fehler, Neustart erforderlich: ' . $e->getMessage(),
0,
$e
);
} catch (LuaSandboxRuntimeError $e) {
// Normaler Laufzeitfehler — Sandbox kann weiterverwendet werden
error_log('Lua-Laufzeitfehler: ' . $e->getMessage());
return null;
}
}
$sandbox = new LuaSandbox();
$sandbox->setMemoryLimit(50 * 1024 * 1024); // 50 MB
$sandbox->setCPULimit(5.0); // 5 Sekunden
try {
$result = executeLua($sandbox, 'return 2 + 2');
echo 'Ergebnis: ' . $result . PHP_EOL;
} catch (RuntimeException $e) {
echo $e->getMessage() . PHP_EOL;
}
// Wichtig · Fallstricke
Wichtig: Nach dem Auftreten eines LuaSandboxFatalError gilt die betroffene LuaSandbox-Instanz als korrumpiert und darf nicht weiterverwendet werden. Jede weitere Methode auf der Instanz könnte zu undefiniertem Verhalten führen.
Die LuaSandbox-Erweiterung ist nicht standardmäßig in PHP enthalten und muss über PECL installiert werden. Sie wird hauptsächlich von MediaWiki für die Scribunto-Erweiterung genutzt.
Die Vererbungshierarchie lautet: LuaSandboxFatalError → LuaSandboxError → Exception. Beim Abfangen sollte LuaSandboxFatalError stets vor dem allgemeineren LuaSandboxError platziert werden, damit der spezifischere catch-Block greift.