Zum Inhalt springen

Einführung

Phasis ist eine reine PHP-JavaScript-Engine. Sie lexikalisiert, parst und führt ECMAScript im PHP-Prozess der Host-Anwendung aus – ohne exec('node …'), ohne FFI und ohne benutzerdefinierte Binärerweiterung. Erforderlich sind drei standardmäßige PHP-Erweiterungen: ext-mbstring, ext-bcmath und ext-curl (der standardmäßige fetch()-Transport). ext-intl und ext-openssl sind optional. Unter Erste Schritte findest du Builds, die bcmath weglassen.

  • Einbettbar – Bette mit der Klasse Phasis\Engine eine JS-Laufzeit in jede PHP-App, jedes Framework oder CLI-Tool ein.
  • Spezifikationskonform – besteht die offizielle test262-Suite zu 100 %, in jeder Kategorie und ohne Auslassungen.
  • Web-APIs – vollständiges Web Platform Pack (URL, TextEncoder/Decoder, atob/btoa, structuredClone, performance, DOMException), vollständiges Fetch Pack (fetch, Request, Response, Headers, Body, AbortController/Signal, Blob, File, FormData, EventTarget, vollständige WHATWG Streams, navigator) sowie crypto + SubtleCrypto, WebSocket, XMLHttpRequest und eine echte Ereignisschleife. 100 % der importierten Web Platform Tests bestehen.
  • Moderne Schnittstelle – Pfeilfunktionen, Klassen, async/await, Promises, Generatoren, Symbol, BigInt, Proxy, Reflect, Temporal, Intl, TypedArrays und vollständige Modulunterstützung.
  • Interoperabilität zwischen PHP und JS – Übergib PHP-Skalare und Arrays an JS (Arrays werden kopiert), binde PHP-Closures als JS-Funktionen ein und rufe aus PHP JS-Funktionen auf. PHP-Objekte können noch nicht mit JS geteilt werden; siehe Gemeinsam genutzte Objekte.

Warum es Phasis gibt

PHP-Anwendungen, die vom Nutzer bereitgestelltes JavaScript ausführen müssen – etwa Templating-Engines, Frontend-SSR-Shims, Datenvalidierungsregeln, Content-Sandboxes oder Headless-Test-Runner –, rufen meist Node.js als separaten Prozess auf oder verzichten auf diese Funktion. Beides erhöht den Betriebsaufwand: eine zweite Laufzeit, eine Serialisierungsgrenze, zahlreiche Pipes zwischen Subprozessen und eine problematische Bereitstellung auf Shared Hosting.

Phasis schließt diese Lücke. Dein PHP-Code kann JavaScript ausschließlich mit PHP 8.2+ sowie mbstring, bcmath und curl lexikalisieren, parsen und ausführen. Die Engine wird als Composer-Paket bereitgestellt und bietet eine kleine, einheitliche API-Schnittstelle.

Funktionen

  • Implementiert die vollständige ECMAScript-Standardbibliothek: Array, String, Object, Math, JSON, Date, RegExp, Map, Set, Promise, Proxy, Reflect, Symbol, BigInt, TypedArray, Temporal, Intl, Generatoren, async Iteratoren und Module.
  • Stellt Web Platform-APIs bereit, auf deren Vorhandensein echte JS-Bibliotheken oft prüfen: URL, URLSearchParams, TextEncoder/TextDecoder, atob/btoa, structuredClone, performance, DOMException. Die vollständige Schnittstelle findest du unter Web-APIs.
  • Stellt fetch mit der vollständigen Fetch-Familie bereit – Request, Response, Headers, Body-Consumer, AbortController/AbortSignal, Blob, File, FormData, EventTarget/Event und vollständige WHATWG Streams (ReadableStream, WritableStream, TransformStream, BYOB, Warteschlangenstrategien). Echtes HTTP funktioniert dank PHPs ext-curl direkt nach der Installation.
  • Stellt crypto und vollständiges SubtleCrypto (SHA-Familie, HMAC, AES-GCM/CBC/CTR, RSA-OAEP/PSS/PKCS1, ECDSA, ECDH, HKDF, PBKDF2), WebSocket (RFC 6455 und austauschbarer Transport) sowie XMLHttpRequest (auf demselben Fetch-Transport aufbauend) bereit.
  • Stellt eine echte Ereignisschleife bereit: setTimeout, setInterval, clearTimeout, clearInterval, queueMicrotask sowie Stage-3-AsyncContext für die Wertübertragung über asynchrone Grenzen hinweg.
  • Unterstützt moderne Syntax – Destructuring, Spread/Rest, berechnete Eigenschaften, optionales Chaining, Nullish-Coalescing, Template-Literale, getaggte Templates, Klassen (mit privaten Feldern, statischen Blöcken und Decorators) sowie Top-Level-Await.
  • Konvertiert Werte über die Grenze zwischen PHP und JS hinweg. Skalare und Arrays werden hineinkopiert, aufrufbare Werte aus PHP werden zu JS-Funktionen und JS-Ergebnisse kommen als PHP-Skalare und Arrays zurück. Die genauen Regeln findest du unter Wertkonvertierung.
  • Läuft unter der Kontrolle des Hosts. Der Host verwaltet den fetch-Transport und die Richtlinien-Hooks, die Ereignisschleife läuft mit virtueller Zeit und eine feste Obergrenze für den Aufrufstack stoppt endlose Rekursion. Es gibt eine Begrenzung für Schleifendurchläufe, sie gilt aber noch nicht für Schleifen der Bytecode-VM. Außerdem gibt es keine Grenzen für Stringlänge, Ausgabe oder Laufzeit; siehe API: setLimit.
  • Ist mit Node.js (V8) verifiziert. CI führt bei jedem Push auf main und jedem Pull Request die Unit- und Oracle-Suites aus. Die Web Platform Tests und Suites für beliebte Pakete laufen, wenn sich der Engine-Quellcode ändert; die vollständige test262-Matrix wird manuell ausgeführt und ihr Snapshot in COMPAT.md eingecheckt. Siehe Kompatibilität.

Was es nicht ist

Phasis ist kein JIT-Compiler. Es handelt sich um einen baumwandelnden Interpreter mit einer optional eingesetzten Bytecode-VM. Bei dispatchgebundenen Workloads ist mit etwa dem 100-Fachen der Laufzeit von V8 zu rechnen. Dafür gibt es keine Abhängigkeiten, reines PHP und hostgesteuerte Ausführung – ideal, um JavaScript in PHP-Apps einzubetten, wenn Korrektheit und Isolation wichtiger sind als maximaler Durchsatz.

Wo du anfangen kannst

  • Erste Schritte – installiere die Engine und führe dein erstes Skript aus.
  • CLI – bin/phasis zum Ausführen von Dateien, Auswerten von Quellcode und Ausgeben des AST.
  • API – Bette Phasis\Engine in deine PHP-App ein.
  • Interoperabilität – übergib PHP-Werte und aufrufbare Werte an JavaScript.
  • Kompatibilität – test262-Abdeckung und unterstützte Funktionen.
  • Parser – parse JavaScript in einen typisierten AST oder ESTree, ohne ihn auszuführen.
  • Formatter – formatiere JavaScript, JSON und CSS in einem mit Prettier kompatiblen Layout.
  • Fortgeschrittenes – Architektur, Bytecode-VM, Benchmarks und das Oracle-Testmodell.