Introduktion
Phasis är en ren PHP-JavaScript-motor. Den lexar, parsar och kör ECMAScript i värdens PHP-process — utan exec('node …'), FFI eller ett anpassat binärt tillägg. Den kräver tre standardtillägg för PHP: ext-mbstring, ext-bcmath och ext-curl (standardtransporten för fetch()). ext-intl och ext-openssl är valfria. Se Kom igång för byggen som utelämnar bcmath.
- Inbäddningsbar — lägg till en JS-körmiljö i valfri PHP-app, ramverk eller verktyg i CLI via klassen
Phasis\Engine. - Specifikationskompatibel — klarar den officiella test262-sviten till 100 %, i alla kategorier utan undantag.
- Webb-API:er — fullständiga Web Platform Pack (URL, TextEncoder/Decoder, atob/btoa, structuredClone, performance, DOMException), fullständiga Fetch Pack (fetch, Request, Response, Headers, Body, AbortController/Signal, Blob, File, FormData, EventTarget, fullständiga WHATWG Streams, navigator), plus
crypto+SubtleCrypto,WebSocket,XMLHttpRequestoch en riktig händelseloop. 100 % av importerade Web Platform Tests klaras. - Modernt gränssnitt — pilfunktioner, klasser, async/await, Promises, generatorer, Symbol, BigInt, Proxy, Reflect, Temporal, Intl, TypedArrays och fullt modulstöd.
- Samverkan mellan PHP och JS — skicka PHP skalärer och arrayer till JS (arrayer kopieras), bind PHP-slutningar som JS-funktioner och anropa JS-funktioner från PHP. PHP-objekt kan ännu inte delas med JS; se Delade objekt.
Varför Phasis finns
PHP-applikationer som behöver köra användartillhandahållen JavaScript — mallmotorer, shim-lösningar för rendering på servern, datavalideringsregler, innehållssandlådor och huvudlösa testrunners — anropar vanligtvis Node.js via skalet eller hoppar över funktionen. Båda alternativen ökar den operativa komplexiteten: en andra körmiljö, en serialiseringsgräns, ett nätverk av rör för underprocesser och en besvärlig driftsättningssituation för delad hosting.
Phasis fyller den luckan. Din PHP-kod kan lexas, parsas och köras med JavaScript och endast PHP 8.2+ med mbstring, bcmath och curl. Motorn levereras som ett Composer-paket och exponerar ett enda litet API-gränssnitt.
Vad det gör
- Implementerar hela ECMAScript-standardbiblioteket:
Array,String,Object,Math,JSON,Date,RegExp,Map,Set,Promise,Proxy,Reflect,Symbol,BigInt,TypedArray,Temporal,Intl, generatorer, asynkrona iteratorer och moduler. - Levererar de Web Platform-API:er som bibliotek för JS i praktisk användning förkontrollerar:
URL,URLSearchParams,TextEncoder/TextDecoder,atob/btoa,structuredClone,performance,DOMException. Se Webb-API:er för hela gränssnittet. - Levererar
fetchmed hela Fetch-familjen —Request,Response,Headers, body-konsumenter,AbortController/AbortSignal,Blob,File,FormData,EventTarget/Eventoch fullständiga WHATWG Streams (ReadableStream,WritableStream,TransformStream, BYOB och köstrategier). Riktig HTTP fungerar direkt via PHPsext-curl. - Levererar
cryptosamt fullständigtSubtleCrypto(SHA-familjen, HMAC, AES-GCM/CBC/CTR, RSA-OAEP/PSS/PKCS1, ECDSA, ECDH, HKDF, PBKDF2),WebSocket(RFC 6455 samt utbytbar transport) ochXMLHttpRequest(byggt ovanpå samma fetch-transport). - Levererar en riktig händelseloop:
setTimeout,setInterval,clearTimeout,clearInterval,queueMicrotasksamt Stage-3AsyncContextför värdespridning över asynkrona gränser. - Stöder modern syntax — destrukturering, spread/rest, beräknade egenskaper, valfri kedjning, nullish-sammanslagning, mallsträngar, taggade mallar, klasser (med privata fält, statiska block och dekoratörer) samt await på toppnivå.
- Konverterar värden över gränsen mellan PHP och JS. Skalärer och arrayer kopieras in, anropbara PHP blir JS-funktioner och resultat från JS returneras som PHP-skalärer och arrayer. Se Värdekonvertering för de exakta reglerna.
- Körs under värdens kontroll. Värden hanterar transport och policykrokar för
fetch, händelseloopen körs med virtuell tid och en fast gräns för anropsstacken stoppar skenande rekursion. Det finns en gräns för loopvarv, men den upprätthålls ännu inte för loopar som bytekod-VM:en kör, och det finns inga gränser för stränglängd, utdata eller körtid; se API: setLimit. - Verifieras mot Node.js (V8). CI kör enhets- och orakelsviterna vid varje push till
mainoch varje pull request, samt Web Platform Tests och sviter för populära paket när motorns källkod ändras; hela test262-matrisen körs manuellt och dess ögonblicksbild checkas in iCOMPAT.md. Se Kompatibilitet.
Vad det inte är
Phasis är ingen JIT-kompilator. Det är en trädvandrande tolk med en opportunistisk bytekod-VM. Räkna med ~100× körtiden för V8 vid arbetsbelastningar som begränsas av dispatch. Kompromissen ger inga beroenden, ren PHP och körning under värdens kontroll — perfekt för att bädda in JavaScript i PHP-appar där korrekthet och isolering är viktigare än rå genomströmning.
Kom igång
- Kom igång — installera och kör ditt första skript.
- CLICLI —
bin/phasisför att köra filer, utvärdera källkod och dumpa AST. - APIBädda in — bädda in
Phasis\Enginei din PHP-app. - Samverkan — skicka värden och anropsbara funktioner från PHP till JavaScript.
- Kompatibilitet — test262-täckning och funktioner som stöds.
- Parser — parsa JavaScript till en typad AST eller ESTree utan att köra koden.
- Formaterare — formatera JavaScript, JSON och CSS med layout som är kompatibel med prettier.
- Avancerat — arkitektur, bytekod-VM, riktmärken och orakeltestmodellen.