Přejít k obsahu

Ú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, XMLHttpRequest a 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í fetch s kompletní sadou Fetch — Request, Response, Headers, čtečky těla, AbortController/AbortSignal, Blob, File, FormData, EventTarget/Event a kompletní WHATWG Streams (ReadableStream, WritableStream, TransformStream, BYOB, strategie řazení do fronty). Skutečný HTTP funguje ihned díky PHP a jeho ext-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) a XMLHttpRequest (postavené na stejném fetch transportu).
  • Obsahuje skutečnou smyčku událostí: setTimeout, setInterval, clearTimeout, clearInterval, queueMicrotask a Stage-3 AsyncContext pro 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 fetch a 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 main a 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 do COMPAT.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/phasis pro spouštění souborů, vyhodnocování zdrojového kódu a výpis AST.
  • API — vložte Phasis\Engine do 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.