Start · Sprachen · PHP · Referenz · V8Js

V8Js

Klasse

Kernklasse der V8Js-Erweiterung: Erstellt einen isolierten JavaScript-Ausführungskontext, in dem JS-Code kompiliert und ausgeführt werden kann.

Kategorie: misc

Signatur

class V8Js

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
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!
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");');
[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;
}
JS-Fehler: ReferenceError: this_function_does_not_exist is not defined Zeilennummer: 1

// 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.