Treci la conținut

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 fetch cu î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 PHP ext-curl.
  • Include crypto + SubtleCrypto complet (familia SHA, HMAC, AES-GCM/CBC/CTR, RSA-OAEP/PSS/PKCS1, ECDSA, ECDH, HKDF, PBKDF2), WebSocket (RFC 6455 + transport interschimbabil) și XMLHttpRequest (stratificat peste același transport fetch).
  • Include o buclă de evenimente reală: setTimeout, setInterval, clearTimeout, clearInterval, queueMicrotask, plus AsyncContext Stage-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 în COMPAT.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/phasis pentru 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.