Bevezetés
A Phasis tisztán PHP JavaScript motor. ECMAScriptet tokenizál, elemez és hajt végre a gazda PHP folyamatában — exec('node …'), FFI és egyedi bináris bővítmény nélkül. Három szabványos PHP bővítményre van szüksége: ext-mbstring, ext-bcmath és ext-curl (az alapértelmezett fetch() átviteli mód). A ext-intl és a ext-openssl opcionális. A bcmath-at kihagyó buildekért lásd az Első lépések oldalt.
- Beágyazható — illesszen be egy JS futtatókörnyezetet bármely PHP alkalmazásba, keretrendszerbe vagy CLI eszközbe a
Phasis\Engineosztály segítségével. - Specifikációnak megfelelő — teljesíti a hivatalos test262 tesztcsomagot 100 %-ban, minden kategóriában, kihagyás nélkül.
- Webes API-k — teljes Web Platform Pack (URL, TextEncoder/Decoder, atob/btoa, structuredClone, performance, DOMException), teljes Fetch Pack (fetch, Request, Response, Headers, Body, AbortController/Signal, Blob, File, FormData, EventTarget, teljes WHATWG Streams, navigator), továbbá
crypto+SubtleCrypto,WebSocket,XMLHttpRequestés valódi eseményciklus. Az importált Web Platform Tests 100 %-a sikeres. - Modern felület — nyílfüggvények, osztályok, async/await, Promise-ok, generátorok, Symbol, BigInt, Proxy, Reflect, Temporal, Intl, TypedArray-ek, teljes modultámogatás.
- PHP↔JS együttműködés — adjon át PHP skalárokat és tömböket a JS számára (a tömbök másolódnak), kössön PHP closure-öket JS függvényekként, és hívjon JS függvényeket a PHP környezetéből. A PHP objektumok még nem oszthatók meg a JS környezetével; lásd: Megosztott objektumok.
Miért létezik a Phasis
Azok a PHP-alkalmazások, amelyeknek felhasználó által megadott JavaScript kódot kell futtatniuk — például sablonmotorok, frontend SSR-segédek, adatellenőrzési szabályok, tartalmi homokozók és headless tesztfuttatók — rendszerint külső folyamatként indítják a Node.js-t, vagy kihagyják ezt a funkciót. Mindkét megoldás működési bonyodalmakat okoz: egy második futtatókörnyezetet, szerializációs határt, alfolyamatok közötti csővezeték-hálózatot, valamint problémás telepíthetőséget megosztott tárhelyen.
A Phasis áthidalja ezt a hiányt. A PHP kód kizárólag PHP 8.2+ használatával képes tokenizálni, elemezni és végrehajtani a JavaScript-t, a mbstring, bcmath és curl bővítményekkel. A motor Composer-csomagként érkezik, és egyetlen kis API felületet tesz elérhetővé.
Mit tud
- Megvalósítja az ECMAScript teljes szabványos könyvtárát:
Array,String,Object,Math,JSON,Date,RegExp,Map,Set,Promise,Proxy,Reflect,Symbol,BigInt,TypedArray,Temporal,Intl, generátorok, aszinkron iterátorok és modulok. - Tartalmazza azokat a Web Platform API-kat, amelyeket a való világban használt JS könyvtárak előzetesen ellenőriznek:
URL,URLSearchParams,TextEncoder/TextDecoder,atob/btoa,structuredClone,performance,DOMException. A teljes felületet lásd a Webes API-k oldalon. - Tartalmazza a
fetch-t a teljes Fetch-családdal —Request,Response,Headers, törzset feldolgozó elemek,AbortController/AbortSignal,Blob,File,FormData,EventTarget/Event, valamint a teljes WHATWG Streams (ReadableStream,WritableStream,TransformStream, BYOB, sorba állítási stratégiák). A valódi HTTP azonnal működik a PHPext-curlmegoldásán keresztül. - Tartalmazza a
crypto-t és a teljesSubtleCrypto-t (SHA-család, HMAC, AES-GCM/CBC/CTR, RSA-OAEP/PSS/PKCS1, ECDSA, ECDH, HKDF, PBKDF2), aWebSocket-t (RFC 6455 + cserélhető átviteli mód), valamint aXMLHttpRequest-t (ugyanarra a fetch-átviteli módra építve). - Valódi eseményciklust biztosít:
setTimeout,setInterval,clearTimeout,clearInterval,queueMicrotask, valamint a Stage-3AsyncContextfunkciót, amely továbbítja az értékeket az aszinkron határokon át. - Támogatja a modern szintaxist: destrukturálás, spread/rest, számított tulajdonságok, opcionális láncolás, nullish coalescing, sablonliterálok, címkézett sablonok, osztályok (privát mezőkkel, statikus blokkokkal, dekorátorokkal), felső szintű await.
- Értékeket alakít át az PHP↔JS határon. A skalárértékek és tömbök másolatként kerülnek át, a PHP hívható elemek JS függvényekké válnak, a JS eredmények pedig PHP skalárértékként és tömbként érkeznek vissza. A pontos szabályokat lásd az Értékátalakítás oldalon.
- A gazda vezérlése alatt fut. A gazda kezeli az
fetchátviteli módot és a házirend-hookokat, az eseményciklus virtuális időben fut, a rögzített hívásverem-korlát pedig megállítja az elszabaduló rekurziót. Az iterációs ciklusok korlátja létezik, de a bájtkód-VM által futtatott ciklusokra még nincs érvényben; karakterlánc-hossz-, kimenet- és valós idejű korlát sincs. Lásd: API: setLimit. - A Node.js (V8) alapján ellenőrzött. A CI minden pushnál
main-ra és minden pull requestnél futtatja az egység- és oracle-teszteket; a Web Platform Tests és a népszerű csomagok tesztcsomagjai pedig akkor futnak, amikor változik a motor forráskódja. A teljes test262 mátrixot kézzel futtatják, pillanatképét pedig véglegesítik aCOMPAT.mdtárolóban. Lásd: Kompatibilitás.
Ami nem tartozik ide
A Phasis nem JIT-fordító. Fa-bejárásos értelmező, amely alkalomszerűen bájtkód-VM-et használ. A diszpécserhez kötött feladatoknál a V8 futásidejének körülbelül 100-szeresére számítson. A kompromisszum: nincsenek függőségek, tiszta PHP, és a gazda vezérli a végrehajtást — ideális a JavaScript beágyazásához PHP-alkalmazásokba, ahol a helyesség és az elkülönítés fontosabb a nyers áteresztőképességnél.
Hol érdemes kezdeni
- Első lépések — telepítse és futtassa az első szkriptet.
- CLI —
bin/phasisfájlok futtatásához, forráskód kiértékeléséhez és az AST kiíratásához. - API — ágyazza be a
Phasis\Engine-t a PHP alkalmazásába. - Együttműködés — adjon át PHP értékeket és hívható elemeket a JavaScript számára.
- Kompatibilitás — test262-lefedettség és támogatott funkciók.
- Elemző — elemezze a JavaScript-t típusos AST-vé vagy ESTree-vé anélkül, hogy végrehajtaná.
- Formázó — formázza a JavaScript, JSON és CSS elemeket Prettier-kompatibilis elrendezéssel.
- Haladó témák — architektúra, bájtkód-VM, teljesítménymérések és az oracle-tesztelési modell.