Introducere
Phasis este un motor JavaScript scris integral în PHP. Lexează, parsează și execută ECMAScript în procesul gazdă PHP — fără exec('node …'), fără FFI și fără o extensie binară personalizată. Necesită trei extensii standard PHP: ext-mbstring, ext-bcmath și ext-curl (transportul implicit fetch()). ext-intl și ext-openssl sunt opționale. Consultați Noțiuni introductive pentru build-uri care nu includ bcmath.
- Încorporabil — adăugați un runtime JS în orice aplicație PHP, framework sau instrument CLI prin clasa
Phasis\Engine. - Conform cu specificația — trece suita oficială test262 la 100 %, fiecare categorie, fără omisiuni.
- API-uri web — Web Platform Pack complet (URL, TextEncoder/Decoder, atob/btoa, structuredClone, performance, DOMException), Fetch Pack complet (fetch, Request, Response, Headers, Body, AbortController/Signal, Blob, File, FormData, EventTarget, WHATWG Streams complete, navigator), plus
crypto+SubtleCrypto,WebSocket,XMLHttpRequestși o buclă de evenimente reală. 100 % dintre testele Web Platform importate trec. - Suprafață modernă — funcții săgeată, clase, async/await, Promises, generatoare, Symbol, BigInt, Proxy, Reflect, Temporal, Intl, TypedArrays, suport complet pentru module.
- Interoperabilitate PHP↔JS — transmiteți scalari și tablouri PHP către JS (tablourile sunt copiate), legați închiderile PHP ca funcții JS și apelați funcții JS din PHP. Obiectele PHP nu pot fi încă partajate cu JS; consultați Obiecte partajate.
De ce există Phasis
Aplicațiile PHP care trebuie să ruleze JavaScript furnizat de utilizator — motoare de șabloane, shim-uri SSR pentru frontend, reguli de validare a datelor, medii izolate pentru conținut, runner-e de teste fără interfață grafică — apelează de obicei Node.js ca proces extern sau omit funcționalitatea. Ambele variante adaugă complexitate operațională: un al doilea runtime, o limită de serializare, o rețea de pipe-uri între subprocese și dificultăți la implementarea în siguranță pe găzduire partajată.
Phasis elimină acest obstacol. Codul PHP poate lexua, parsa și executa JavaScript folosind doar PHP 8.2+ cu mbstring, bcmath și curl. Motorul este distribuit ca pachet Composer și oferă o singură suprafață API compactă.
Ce face
- Implementează întreaga bibliotecă standard ECMAScript:
Array,String,Object,Math,JSON,Date,RegExp,Map,Set,Promise,Proxy,Reflect,Symbol,BigInt,TypedArray,Temporal,Intl, generatoare, iteratori asincroni și module. - Include API-urile Web Platform pe care bibliotecile JS din aplicații reale le verifică în avans:
URL,URLSearchParams,TextEncoder/TextDecoder,atob/btoa,structuredClone,performance,DOMException. Consultați API-uri web pentru întreaga suprafață. - Include
fetchcu întreaga familie Fetch —Request,Response,Headers, consumatori de corp,AbortController/AbortSignal,Blob,File,FormData,EventTarget/Eventși WHATWG Streams complete (ReadableStream,WritableStream,TransformStream, BYOB, strategii de coadă). HTTP funcționează imediat prin PHPext-curl. - Include
crypto+SubtleCryptocomplet (familia SHA, HMAC, AES-GCM/CBC/CTR, RSA-OAEP/PSS/PKCS1, ECDSA, ECDH, HKDF, PBKDF2),WebSocket(RFC 6455 + transport interschimbabil) șiXMLHttpRequest(stratificat peste același transport fetch). - Include o buclă de evenimente reală:
setTimeout,setInterval,clearTimeout,clearInterval,queueMicrotask, plusAsyncContextStage-3 pentru propagarea valorilor peste limite asincrone. - Acceptă sintaxa modernă — destructurare, spread/rest, proprietăți calculate, înlănțuire opțională, coalescență nullish, șabloane literale, șabloane cu etichete, clase (cu câmpuri private, blocuri statice și decoratori), top-level await.
- Convertește valorile peste limita PHP↔JS. Scalarii și tablourile sunt copiați la intrare, funcțiile apelabile PHP devin funcții JS, iar rezultatele JS revin ca scalari și tablouri PHP. Consultați Conversia valorilor pentru regulile exacte.
- Rulează sub controlul gazdei. Gazda deține transportul
fetchși cârligele de politică, bucla de evenimente rulează în timp virtual, iar o limită fixă a stivei de apeluri oprește recursivitatea necontrolată. Există o limită pentru iterațiile buclelor, dar încă nu se aplică buclelor executate de VM-ul de bytecode și nu există limite pentru lungimea șirurilor, rezultat sau timpul de execuție; consultați API: setLimit. - Este verificat față de Node.js (V8). CI rulează suitele unitare și oracle la fiecare push către
mainși la fiecare pull request, iar testele Web Platform și suitele pentru pachete populare când se modifică sursa motorului; întreaga matrice test262 este rulată manual, iar instantaneul ei este înregistrat înCOMPAT.md. Consultați Compatibilitate.
Ce nu este
Phasis nu este un compilator JIT. Este un interpret care parcurge arborele, cu o mașină virtuală de bytecode folosită oportunist. Pentru sarcini limitate de dispecerizare, așteptați-vă la un timp de execuție de ~100× față de V8. Compromisul oferă zero dependențe, PHP pur și execuție controlată de gazdă — ideal pentru încorporarea JavaScript în aplicații PHP, unde corectitudinea și izolarea contează mai mult decât debitul brut.
De unde să începeți
- Noțiuni introductive — instalați și rulați primul script.
- CLI —
bin/phasispentru rularea fișierelor, evaluarea sursei și afișarea AST-ului. - API — încorporați
Phasis\Engineîn aplicația PHP. - Interoperabilitate — transmiteți valori și funcții apelabile PHP către JavaScript.
- Compatibilitate — acoperire test262 și funcții acceptate.
- Parser — parsați JavaScript într-un AST tipizat sau ESTree fără a-l executa.
- Formator — formatați JavaScript, JSON și CSS cu aranjare compatibilă cu prettier.
- Avansat — arhitectură, VM de bytecode, teste de performanță și modelul de testare oracle.