Signatur
Beschreibung
V8Js ist die zentrale Klasse der gleichnamigen PHP-Erweiterung, die auf Googles V8 JavaScript-Engine basiert. Jede Instanz erzeugt einen vollständig isolierten JS-Kontext mit eigenem Speicherbereich und eigenem Scope. PHP-Variablen und -Objekte können als JavaScript-Variablen in diesen Kontext eingebracht werden, und umgekehrt können JavaScript-Ergebnisse als PHP-Werte zurückgegeben werden.
Typische Anwendungsfelder sind serverseitiges Rendern von JavaScript-Frameworks (z. B. React, Vue im SSR-Modus), Template-Engines, Validierungslogik, die clientseitig und serverseitig identisch ausgeführt werden soll, sowie das sichere Sandboxen von nutzerbereitgestelltem JavaScript-Code.
Der Kontext kann durch Angabe eines Objekt-Namens (object_name) konfiguriert werden, unter dem PHP-Funktionen und -Werte im JS-Scope erreichbar sind. Über Optionen lassen sich Speicher- und Zeitlimits setzen, um Endlos-Schleifen oder übermäßigen Speicherverbrauch zu verhindern. Nicht ausgeführter Code kann mit compileString() vorab kompiliert werden, um mehrfache Ausführungen zu beschleunigen.
Wichtig: Die V8Js-Erweiterung ist nicht Bestandteil der PHP-Standarddistribution und muss separat über PECL installiert werden. Sie setzt eine kompatible Version der V8-Bibliothek voraus, was die Installation komplex machen kann.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $object_name | string | PHP | Name des JavaScript-Objekts, unter dem PHP-Methoden und -Werte im JS-Kontext zugänglich sind. Standard ist 'PHP', sodass z. B. PHP.print() in JS verfügbar ist. |
| $variables | array | [] | Assoziatives Array von Variablen, die initial in den JavaScript-Kontext eingebettet werden. Die Array-Schlüssel werden zu JS-Variablennamen. |
| $extensions | array | [] | Liste zuvor mit V8Js::registerExtension() registrierter Erweiterungen, die in diesem Kontext verfügbar sein sollen. |
| $report_uncaught_exceptions | bool | true | Legt fest, ob nicht abgefangene JavaScript-Ausnahmen als V8JsException in PHP weitergeleitet werden. |
Beispiele
Einfache JavaScript-Ausführung und Rückgabe
<?php
// Neuen V8Js-Kontext erstellen
$v8 = new V8Js();
// JavaScript ausführen und Ergebnis in PHP empfangen
$result = $v8->executeString('var add = function(a, b) { return a + b; }; add(3, 7);');
echo $result; // 10
PHP-Variablen in den JS-Kontext einbetten
<?php
// Variablen werden initial in den Kontext injiziert
$v8 = new V8Js('PHP', ['greeting' => 'Hallo', 'name' => 'Welt']);
$result = $v8->executeString('greeting + ", " + name + "!"');
echo $result; // Hallo, Welt!
PHP-Funktion aus JavaScript heraus aufrufen
<?php
$v8 = new V8Js();
// PHP-Funktion als JS-Callback bereitstellen
$v8->log = function(string $msg): void {
echo '[PHP-Log] ' . $msg . PHP_EOL;
};
$v8->executeString('PHP.log("Nachricht aus JavaScript");');
Ausnahmebehandlung bei fehlerhaftem JS
<?php
$v8 = new V8Js();
try {
$v8->executeString('this_function_does_not_exist();');
} catch (V8JsException $e) {
echo 'JS-Fehler: ' . $e->getMessage() . PHP_EOL;
echo 'Zeilennummer: ' . $e->getJsLineNumber() . PHP_EOL;
}
// Wichtig · Fallstricke
Sicherheit: Obwohl V8Js einen isolierten Sandbox-Kontext bietet, sollte nutzerbereitgestellter JavaScript-Code immer mit Vorsicht behandelt werden. Setze Speicher- und Zeitlimits über setMemoryLimit() und setTimeLimit(), um Denial-of-Service-Angriffe durch Endlosschleifen oder übermäßigen Speicherverbrauch zu verhindern.
Installation: Die Erweiterung ist nicht im PHP-Core enthalten. Sie wird über PECL bereitgestellt (pecl install v8js) und erfordert eine passende V8-Bibliothek. Die benötigte V8-Version ist an die jeweilige v8js-Version gebunden – Inkompatibilitäten sind häufig.
Ressourcen: Jede V8Js-Instanz hält einen eigenen V8-Heap. Erstelle nicht unnötig viele Instanzen pro Request. Für wiederholte Ausführungen desselben Skripts empfiehlt sich compileString(), um den Kompilierungsaufwand zu reduzieren.
Rückgabe-Typen: JavaScript-Primitive werden nach PHP-Typen konvertiert (String, int, float, bool, null). JavaScript-Objekte und -Arrays werden als V8JsObject zurückgegeben und können per Property- oder Array-Zugriff traversiert werden.