Start · Sprachen · PHP · Referenz · LuaSandboxFatalError

LuaSandboxFatalError

Klasse

Repräsentiert einen fatalen Fehler in der <code>LuaSandbox</code>, der eine weitere Ausführung des Lua-Codes unmöglich macht.

seit PHP 1.0.0 Kategorie: error

Signatur

class LuaSandboxFatalError extends LuaSandboxError

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;
}
Fataler Sandbox-Fehler: LuaSandbox memory limit exceeded Die Sandbox-Instanz muss verworfen werden.

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;
}
Ergebnis: 4

// 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: LuaSandboxFatalErrorLuaSandboxErrorException. Beim Abfangen sollte LuaSandboxFatalError stets vor dem allgemeineren LuaSandboxError platziert werden, damit der spezifischere catch-Block greift.