Ugrás a tartalomhoz

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\Engine osztá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 PHP ext-curl megoldásán keresztül.
  • Tartalmazza a crypto-t és a teljes SubtleCrypto-t (SHA-család, HMAC, AES-GCM/CBC/CTR, RSA-OAEP/PSS/PKCS1, ECDSA, ECDH, HKDF, PBKDF2), a WebSocket-t (RFC 6455 + cserélhető átviteli mód), valamint a XMLHttpRequest-t (ugyanarra a fetch-átviteli módra építve).
  • Valódi eseményciklust biztosít: setTimeout, setInterval, clearTimeout, clearInterval, queueMicrotask, valamint a Stage-3 AsyncContext funkció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 a COMPAT.md tá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/phasis fá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.