Preskočiť na obsah

Úvod

Phasis je čistý engine PHP JavaScript. Lexuje, analyzuje a vykonáva ECMAScript v procese hostiteľského PHP bez exec('node …'), FFI a vlastného binárneho rozšírenia. Vyžaduje tri štandardné rozšírenia PHP: ext-mbstring, ext-bcmath a ext-curl (predvolený prenosový mechanizmus fetch()). ext-intl a ext-openssl sú voliteľné. Zostavy bez bcmath nájdete v časti Začíname.

  • Vložiteľný — vložte modul JS do ľubovoľnej aplikácie PHP, frameworku alebo nástroja CLI prostredníctvom triedy Phasis\Engine.
  • V súlade so špecifikáciou — úspešne prejde oficiálnou sadou test262 na úrovni 100 %, vo všetkých kategóriách a bez preskočených testov.
  • Webové API — úplný balík Web Platform (URL, TextEncoder/Decoder, atob/btoa, structuredClone, performance, DOMException), úplný balík Fetch (fetch, Request, Response, Headers, Body, AbortController/Signal, Blob, File, FormData, EventTarget, úplné WHATWG Streams, navigator), plus crypto + SubtleCrypto, WebSocket, XMLHttpRequest a skutočná slučka udalostí. Úspešne prejde 100 % importovaných testov Web Platform.
  • Moderné rozhranie — šípkové funkcie, triedy, async/await, Promises, generátory, Symbol, BigInt, Proxy, Reflect, Temporal, Intl, TypedArrays a úplná podpora modulov.
  • Prepojenie PHP↔JS — odovzdávajte skaláre PHP a polia do JS (polia sa kopírujú), viažte uzávery PHP ako funkcie JS a volajte funkcie JS z PHP. Objekty PHP zatiaľ nemožno zdieľať s JS; pozrite si Zdieľané objekty.

Prečo vznikol Phasis

Aplikácie PHP, ktoré potrebujú spúšťať používateľský kód JavaScript — šablónovacie moduly, nástroje na obchádzanie SSR pre frontend, pravidlá overovania údajov, izolované prostredia pre obsah a bezhlavé testovacie spúšťače — zvyčajne spustia Node.js ako externý proces alebo túto funkciu vynechajú. Obe možnosti prinášajú prevádzkovú zložitosť: druhé prostredie, hranicu serializácie, sieť kanálov medzi podprocesmi a náročné nasadenie v zdieľanom hostingu.

Phasis túto medzeru vypĺňa. Váš kód PHP môže lexovať, analyzovať a spúšťať JavaScript iba pomocou PHP 8.2+ s mbstring, bcmath a curl. Engine sa dodáva ako balík Composer a sprístupňuje malé jednotné rozhranie API.

Čo dokáže

  • Implementuje úplnú štandardnú knižnicu ECMAScript: Array, String, Object, Math, JSON, Date, RegExp, Map, Set, Promise, Proxy, Reflect, Symbol, BigInt, TypedArray, Temporal, Intl, generátory, asynchrónne iterátory a moduly.
  • Dodáva rozhrania API Web Platform, ktoré knižnice JS z praxe vopred kontrolujú: URL, URLSearchParams, TextEncoder/TextDecoder, atob/btoa, structuredClone, performance, DOMException. Úplný zoznam rozhraní nájdete v časti Webové API.
  • Dodáva fetch s úplnou rodinou Fetch — Request, Response, Headers, čítačmi tela, AbortController/AbortSignal, Blob, File, FormData, EventTarget/Event a úplným WHATWG Streams (ReadableStream, WritableStream, TransformStream, BYOB a stratégiami frontu). Skutočný HTTP funguje okamžite vďaka PHP ext-curl.
  • Dodáva crypto + úplné SubtleCrypto (rodina SHA, HMAC, AES-GCM/CBC/CTR, RSA-OAEP/PSS/PKCS1, ECDSA, ECDH, HKDF, PBKDF2), WebSocket (RFC 6455 + vymeniteľný prenosový mechanizmus) a XMLHttpRequest (postavené na rovnakom prenosovom mechanizme fetch).
  • Dodáva skutočnú slučku udalostí: setTimeout, setInterval, clearTimeout, clearInterval, queueMicrotask a Stage-3 AsyncContext na prenos hodnôt cez asynchrónne hranice.
  • Podporuje modernú syntax — deštrukturalizáciu, spread/rest, vypočítané vlastnosti, voliteľné reťazenie, spájanie pri hodnotách null, šablónové literály, označené šablóny, triedy (so súkromnými poľami, statickými blokmi a dekorátormi) a await na najvyššej úrovni.
  • Prevádza hodnoty cez hranicu PHP↔JS. Skaláre a polia sa kopírujú dovnútra, volateľné objekty PHP sa menia na funkcie JS a výsledky JS sa vracajú ako skaláre a polia PHP. Presné pravidlá nájdete v časti Konverzia hodnôt.
  • Beží pod kontrolou hostiteľa. Hostiteľ vlastní prenosový mechanizmus fetch a politické háky, slučka udalostí beží vo virtuálnom čase a pevný limit zásobníka volaní zastavuje nekonečnú rekurziu. Limit počtu iterácií slučky existuje, ale zatiaľ sa nevynucuje pri slučkách spúšťaných VM bajtkódu; neexistujú ani limity dĺžky reťazcov, výstupu či reálneho času. Pozrite si API: setLimit.
  • Overuje sa voči Node.js (V8). CI spúšťa jednotkové testy a testy referenčnej implementácie pri každom odoslaní do main a pri každej požiadavke na stiahnutie; testy Web Platform a sady populárnych balíkov spúšťa pri zmenách zdrojového kódu enginu. Úplnú maticu test262 spúšťa vývojár ručne a jej snímka sa ukladá do COMPAT.md. Pozrite si Kompatibilita.

Čo to nie je

Phasis nie je JIT kompilátor. Je to interpret prechádzajúci strom s príležitostným virtuálnym strojom bajtkódu. Pri úlohách limitovaných obsluhou očakávajte približne 100× dlhší beh než pri V8. Kompromisom sú nulové závislosti, čisté PHP a vykonávanie riadené hostiteľom — ideálne na vloženie JavaScript do aplikácií PHP, kde sú správnosť a izolácia dôležitejšie než surová priepustnosť.

Kde začať

  • Začíname — nainštalujte a spustite svoj prvý skript.
  • CLI — bin/phasis na spúšťanie súborov, vyhodnocovanie zdrojového kódu a výpis AST.
  • API — vložte Phasis\Engine do svojej aplikácie PHP.
  • Prepojenie — odovzdávanie hodnôt a volateľných objektov PHP do JavaScript.
  • Kompatibilita — pokrytie test262 a podporované funkcie.
  • Parser — parsovanie JavaScript do typovaného AST alebo ESTree bez jeho vykonania.
  • Formátovač — formátovanie JavaScript, JSON a CSS s rozložením kompatibilným s prettier.
  • Pokročilé témy — architektúra, virtuálny stroj bajtkódu, benchmarky a model testovania pomocou oracle.