Inleiding
Phasis is een pure-PHP JavaScript-engine. Deze lexeert, parseert en voert ECMAScript uit in het hostproces PHP — zonder exec('node …'), zonder FFI en zonder aangepaste binaire extensie. Er zijn drie standaardextensies voor PHP nodig: ext-mbstring, ext-bcmath en ext-curl (het standaardtransport voor fetch()). ext-intl en ext-openssl zijn optioneel. Zie Aan de slag voor builds zonder bcmath.
- Inbedbaar — voeg een JS-runtime toe aan elke PHP-app, elk framework of elke CLI-tool via de klasse
Phasis\Engine. - Voldoet aan de specificatie — slaagt voor de officiële test262-suite met 100 %, in elke categorie, zonder overgeslagen tests.
- Web-API's — volledig Web Platform Pack (URL, TextEncoder/Decoder, atob/btoa, structuredClone, performance, DOMException), volledig Fetch Pack (fetch, Request, Response, Headers, Body, AbortController/Signal, Blob, File, FormData, EventTarget, volledige WHATWG Streams, navigator), plus
crypto+SubtleCrypto,WebSocket,XMLHttpRequesten een echte eventloop. 100 % van de geïmporteerde Web Platform Tests slaagt. - Moderne mogelijkheden — pijl-functies, klassen, async/await, Promises, generators, Symbol, BigInt, Proxy, Reflect, Temporal, Intl, TypedArrays en volledige ondersteuning voor modules.
- Interop tussen PHP en JS — geef PHP scalars en arrays door aan JS (arrays worden gekopieerd), koppel PHP-closures als JS-functies en roep JS-functies aan vanuit PHP. PHP-objecten kunnen nog niet met JS worden gedeeld; zie Gedeelde objecten.
Waarom Phasis bestaat
PHP-applicaties die door gebruikers aangeleverde JavaScript moeten uitvoeren — zoals templating-engines, frontend-SSR-shims, regels voor gegevensvalidatie, contentsandboxes en headless testrunners — roepen meestal Node.js als apart proces aan of slaan deze functie over. Beide opties maken het beheer ingewikkelder: een tweede runtime, een serialisatiegrens, een netwerk van subprocesspipes en lastige uitrol op gedeelde hosting.
Phasis dicht dat gat. Je PHP-code kan JavaScript lexeren, parsen en uitvoeren met alleen PHP 8.2+ en mbstring, bcmath en curl. De engine wordt geleverd als Composer-pakket en biedt één kleine API-interface.
Wat het doet
- Implementeert de volledige standaardbibliotheek van ECMAScript:
Array,String,Object,Math,JSON,Date,RegExp,Map,Set,Promise,Proxy,Reflect,Symbol,BigInt,TypedArray,Temporal,Intl, generators, async iterators en modules. - Levert de Web Platform-API's die echte JS-bibliotheken vooraf controleren:
URL,URLSearchParams,TextEncoder/TextDecoder,atob/btoa,structuredClone,performance,DOMException. Zie Web-API's voor alle mogelijkheden. - Levert
fetchmet de volledige Fetch-familie —Request,Response,Headers, body-consumers,AbortController/AbortSignal,Blob,File,FormData,EventTarget/Eventen volledige WHATWG Streams (ReadableStream,WritableStream,TransformStream, BYOB, wachtrijstrategieën). Een echte HTTP werkt direct via PHP'sext-curl. - Levert
crypto+ volledigeSubtleCrypto(SHA-familie, HMAC, AES-GCM/CBC/CTR, RSA-OAEP/PSS/PKCS1, ECDSA, ECDH, HKDF, PBKDF2),WebSocket(RFC 6455 + verwisselbaar transport) enXMLHttpRequest(gebouwd op hetzelfde fetch-transport). - Levert een echte eventloop:
setTimeout,setInterval,clearTimeout,clearInterval,queueMicrotasken Stage-3AsyncContextvoor het doorgeven van waarden over async-grenzen. - Ondersteunt moderne syntax — destructuring, spread/rest, berekende eigenschappen, optionele chaining, nullish coalescing, template literals, tagged templates, klassen (met privévelden, statische blokken en decorators), top-level await.
- Zet waarden om over de grens tussen PHP en JS. Scalars en arrays worden gekopieerd, PHP-callables worden JS-functies en resultaten van JS komen terug als PHP-scalars en arrays. Zie Waardeconversie voor de exacte regels.
- Draait onder controle van de host. De host beheert het
fetch-transport en beleidsfuncties, de eventloop draait op virtuele tijd en een vaste limiet voor de call-stack voorkomt onbegrensde recursie. Er is een limiet voor loop-iteraties, maar die wordt nog niet afgedwongen voor loops die de bytecode-VM uitvoert. Er zijn ook geen limieten voor tekenreekslengte, uitvoer of wandkloktijd; zie API: setLimit. - Is getest tegen Node.js (V8). CI voert de unit- en oracle-suites uit bij elke push naar
mainen bij elk pull request. De Web Platform Tests en suites voor populaire pakketten worden uitgevoerd wanneer de enginebroncode verandert. De volledige matrix van test262 wordt handmatig gedraaid en de momentopname daarvan wordt vastgelegd inCOMPAT.md. Zie Compatibiliteit.
Wat het niet is
Phasis is geen JIT-compiler. Het is een tree-walking-interpreter met een bytecode-VM die waar mogelijk wordt gebruikt. Reken op ongeveer 100× de runtime van V8 bij workloads die door dispatch worden begrensd. Daar staat tegenover: geen afhankelijkheden, pure PHP en uitvoering onder controle van de host — ideaal om JavaScript in PHP-apps in te bedden, waar correctheid en isolatie belangrijker zijn dan maximale doorvoer.
Waar begin je?
- Aan de slag — installeer de engine en voer je eerste script uit.
- CLI —
bin/phasisom bestanden uit te voeren, broncode te evalueren en de AST uit te schrijven. - API — bed de
Phasis\Enginein je PHP-app in. - Interop — geef PHP-waarden en callables door aan JavaScript.
- Compatibiliteit — test262-dekking en ondersteunde functies.
- Parser — parseer JavaScript naar een getypeerde AST of ESTree zonder deze uit te voeren.
- Formatter — maak JavaScript, JSON en CSS op met een indeling die compatibel is met prettier.
- Geavanceerd — architectuur, bytecode-VM, benchmarks en het oracle-testmodel.