Úvod
Phasis je čistě PHP engine JavaScript. Lexuje, parsuje a spouští ECMAScript v hostitelském procesu PHP — bez exec('node …'), bez FFI a bez vlastního binárního rozšíření. Vyžaduje tři standardní rozšíření PHP: ext-mbstring, ext-bcmath a ext-curl (výchozí transport fetch()). ext-intl a ext-openssl jsou volitelné. Viz Začínáme pro sestavení, která bcmath vynechávají.
- Vhodný k vložení — přidejte běhové prostředí JS do libovolné aplikace PHP, frameworku nebo nástroje CLI pomocí třídy
Phasis\Engine. - V souladu se specifikací — prochází oficiální sadou test262 na 100 %, ve všech kategoriích, bez vynechaných testů.
- Webová API — kompletní Web Platform Pack (URL, TextEncoder/Decoder, atob/btoa, structuredClone, performance, DOMException), kompletní Fetch Pack (fetch, Request, Response, Headers, Body, AbortController/Signal, Blob, File, FormData, EventTarget, kompletní WHATWG Streams, navigator), dále
crypto+SubtleCrypto,WebSocket,XMLHttpRequesta skutečná smyčka událostí. Projde 100 % importovaných Web Platform Tests. - Moderní možnosti — šipkové funkce, třídy, async/await, Promises, generátory, Symbol, BigInt, Proxy, Reflect, Temporal, Intl, TypedArrays, plná podpora modulů.
- Propojení PHP↔JS — předávejte skaláry a pole PHP do JS (pole se kopírují), propojujte uzávěry PHP jako funkce JS a volejte funkce JS z PHP. Objekty PHP zatím nelze sdílet s JS; viz Sdílené objekty.
Proč vzniklo Phasis
Aplikace PHP, které potřebují spouštět uživatelem dodaný JavaScript — šablonovací enginy, nástroje pro frontendové SSR, pravidla ověřování dat, sandboxy obsahu či bezhlavé testovací nástroje — obvykle spouštějí Node.js jako samostatný proces, nebo tuto funkci vynechají. Obě možnosti zvyšují provozní složitost: druhé běhové prostředí, hranici serializace, síť propojených rour podprocesů a problematické nasazení ve sdíleném hostingu.
Phasis tuto mezeru vyplňuje. Váš kód PHP může lexovat, parsovat a spouštět JavaScript pouze pomocí PHP 8.2+ s mbstring, bcmath a curl. Engine se dodává jako balíček Composer a nabízí malé rozhraní API.
Co umí
- Implementuje kompletní standardní knihovnu ECMAScript:
Array,String,Object,Math,JSON,Date,RegExp,Map,Set,Promise,Proxy,Reflect,Symbol,BigInt,TypedArray,Temporal,Intl, generátory, asynchronní iterátory a moduly. - Nabízí API Web Platform, která skutečné knihovny JS předem ověřují:
URL,URLSearchParams,TextEncoder/TextDecoder,atob/btoa,structuredClone,performance,DOMException. Kompletní přehled najdete v části Webová API. - Nabízí
fetchs kompletní sadou Fetch —Request,Response,Headers, čtečky těla,AbortController/AbortSignal,Blob,File,FormData,EventTarget/Eventa kompletní WHATWG Streams (ReadableStream,WritableStream,TransformStream, BYOB, strategie řazení do fronty). Skutečný HTTP funguje ihned díky PHP a jehoext-curl. - Nabízí
crypto+ kompletníSubtleCrypto(rodina SHA, HMAC, AES-GCM/CBC/CTR, RSA-OAEP/PSS/PKCS1, ECDSA, ECDH, HKDF, PBKDF2),WebSocket(RFC 6455 + vyměnitelný transport) aXMLHttpRequest(postavené na stejném fetch transportu). - Obsahuje skutečnou smyčku událostí:
setTimeout,setInterval,clearTimeout,clearInterval,queueMicrotaska Stage-3AsyncContextpro předávání hodnot přes asynchronní hranice. - Podporuje moderní syntaxi — destrukturování, spread/rest, vypočítané vlastnosti, volitelné řetězení, nullish coalescing, šablonové řetězce a označené šablony, třídy (se soukromými poli, statickými bloky a dekorátory) i top-level await.
- Převádí hodnoty přes hranici PHP↔JS. Skaláry a pole se kopírují dovnitř, volatelné objekty PHP se mění na funkce JS a výsledky JS se vracejí jako skaláry a pole PHP. Přesná pravidla najdete v části Převod hodnot.
- Běží pod kontrolou hostitele. Hostitel spravuje transport
fetcha zásady, smyčka událostí běží ve virtuálním čase a pevný limit hloubky zásobníku zastaví nekonečnou rekurzi. Limit počtu iterací smyčky existuje, ale zatím se nevynucuje u smyček spouštěných bajtkódovým VM. Nejsou nastaveny limity délky řetězců, výstupu ani času běhu; viz API: setLimit. - Ověřuje se pomocí Node.js (V8). CI spouští sady unit testů a oracle při každém pushi do
maina každém pull requestu; sady Web Platform Tests a oblíbených balíčků spouští při změně zdrojového kódu enginu. Kompletní testovací matici test262 spouštíme ručně a její snímek ukládáme doCOMPAT.md. Viz Kompatibilita.
Co merql není
Phasis není JIT kompilátor. Jde o interpret procházející syntaktický strom s příležitostným použitím bajtkódového VM. U úloh omezených rychlostí zpracování očekávejte běh přibližně 100× pomalejší než V8. Výhodou jsou nulové závislosti, čisté PHP a vykonávání pod kontrolou hostitele — ideální pro vložení JavaScript do aplikací PHP, kde jsou správnost a izolace důležitější než maximální propustnost.
Kde začít
- Začínáme — nainstalujte a spusťte svůj první skript.
- CLI —
bin/phasispro spouštění souborů, vyhodnocování zdrojového kódu a výpis AST. - API — vložte
Phasis\Enginedo své aplikace PHP. - Propojení — předávejte hodnoty a volatelné objekty PHP do JavaScript.
- Kompatibilita — pokrytí test262 a podporované funkce.
- Parser — parsujte JavaScript do typovaného AST nebo ESTree bez jeho spouštění.
- Formátovač — formátujte JavaScript, JSON a CSS s rozvržením kompatibilním s prettier.
- Pokročilé — architektura, bajtkódový VM, benchmarky a model testování pomocí oracle.