Gå til indhold

Introduktion

Phasis er en ren PHP-JavaScript-motor. Den leksikaliserer, parser og udfører ECMAScript i værtsprocessen PHP — uden exec('node …'), uden FFI og uden en brugerdefineret binær udvidelse. Den kræver tre standardudvidelser til PHP: ext-mbstring, ext-bcmath og ext-curl (standardtransporten fetch()). ext-intl og ext-openssl er valgfrie. Se Kom godt i gang for builds, der udelader bcmath.

  • Kan indlejres — føj en JS-runtime til enhver PHP-app, ethvert framework eller CLI-værktøj via klassen Phasis\Engine.
  • Specifikationskompatibel — består den officielle test262-testpakke med 100 %, i alle kategorier og uden spring over.
  • Web-API'er — fuld Web Platform Pack (URL, TextEncoder/Decoder, atob/btoa, structuredClone, performance, DOMException), fuld Fetch Pack (fetch, Request, Response, Headers, Body, AbortController/Signal, Blob, File, FormData, EventTarget, fulde WHATWG Streams, navigator) samt crypto + SubtleCrypto, WebSocket, XMLHttpRequest og en rigtig event loop. 100 % af de importerede Web Platform Tests består.
  • Moderne funktioner — pilefunktioner, klasser, async/await, Promises, generatorer, Symbol, BigInt, Proxy, Reflect, Temporal, Intl, TypedArrays, fuld understøttelse af moduler.
  • Interoperabilitet mellem PHP og JS — send PHP-skalarer og arrays til JS (arrays kopieres), tilknyt PHP-closures som JS-funktioner, og kald JS-funktioner fra PHP. PHP-objekter kan endnu ikke deles med JS; se Delte objekter.

Hvorfor Phasis findes

PHP-applikationer, der skal køre brugerleveret JavaScript — skabelonmotorer, frontend-SSR-shims, regler til datavalidering, indholdssandkasser, headless-testløbere — starter normalt Node.js som en separat proces eller springer funktionen over. Begge dele øger den driftsmæssige kompleksitet: en ekstra runtime, en serialiseringsgrænse, et netværk af pipes mellem underprocesser og besværlige muligheder for udrulning på delt hosting.

Phasis lukker dette hul. Din PHP-kode kan leksikalisere, parse og udføre JavaScript udelukkende med PHP 8.2+ og mbstring, bcmath og curl. Motoren leveres som en Composer-pakke og har en lille overflade med ét API.

Funktioner

  • Implementerer hele ECMAScript-standardbiblioteket: Array, String, Object, Math, JSON, Date, RegExp, Map, Set, Promise, Proxy, Reflect, Symbol, BigInt, TypedArray, Temporal, Intl, generatorer, async-iteratorer, moduler.
  • Leverer Web Platform-API'er, som virkelige JS-biblioteker forhåndstjekker for: URL, URLSearchParams, TextEncoder/TextDecoder, atob/btoa, structuredClone, performance, DOMException. Se Web-API'er for den fulde overflade.
  • Leverer fetch med hele Fetch-familien — Request, Response, Headers, body-forbrugere, AbortController/AbortSignal, Blob, File, FormData, EventTarget/Event og fulde WHATWG Streams (ReadableStream, WritableStream, TransformStream, BYOB, køstrategier). En rigtig HTTP virker straks via PHPs ext-curl.
  • Leverer crypto + fuld SubtleCrypto (SHA-familien, HMAC, AES-GCM/CBC/CTR, RSA-OAEP/PSS/PKCS1, ECDSA, ECDH, HKDF, PBKDF2), WebSocket (RFC 6455 + udskiftelig transport) og XMLHttpRequest (bygget oven på den samme fetch-transport).
  • Leverer en rigtig event loop: setTimeout, setInterval, clearTimeout, clearInterval, queueMicrotask samt Stage-3 AsyncContext til videreførsel af værdier på tværs af asynkrone grænser.
  • Understøtter moderne syntaks — destrukturering, spread/rest, beregnede egenskaber, valgfri chaining, nullish coalescing, skabelonstrenge, taggede skabeloner, klasser (med private felter, statiske blokke, dekoratorer), top-level await.
  • Konverterer værdier på tværs af grænsen mellem PHP og JS. Skalarer og arrays kopieres ind, PHP-callables bliver til JS-funktioner, og JS-resultater returneres som PHP-skalarer og arrays. Se Værdikonvertering for de præcise regler.
  • Kører under værtens kontrol. Værten ejer transporten fetch og politik-hooks, event loop kører på virtuel tid, og en fast grænse for kaldestakken stopper løbsk rekursion. Der findes en grænse for løkkeiterationer, men den håndhæves endnu ikke på løkker, som bytecode-VM'en kører, og der er ingen grænser for strenglængde, output eller vægurtid; se API: setLimit.
  • Verificeres mod Node.js (V8). CI kører enhedstestene og oracle-testpakkerne ved hver push til main og hver pull request samt Web Platform Tests og testpakkerne for populære pakker, når motorens kildekode ændres; hele test262-matricen køres manuelt, og snapshot'et indsendes til COMPAT.md. Se Kompatibilitet.

Hvad det ikke er

Phasis er ikke en JIT-compiler. Det er en tree-walking-fortolker med en bytecode-VM, der bruges efter behov. Forvent en runtime på ~100× V8 ved arbejdsbelastninger, der er begrænset af dispatch. Til gengæld får du nul afhængigheder, ren PHP og værtsstyret udførelse — perfekt til at indlejre JavaScript i PHP-apps, hvor korrekthed og isolation er vigtigere end rå gennemløbshastighed.

Sådan kommer du i gang

  • Kom godt i gang — installer, og kør dit første script.
  • CLI — bin/phasis til at køre filer, evaluere kildekode og udskrive AST'en.
  • API — indlejr Phasis\Engine i din PHP-app.
  • Interoperabilitet — send PHP-værdier og callables til JavaScript.
  • Kompatibilitet — test262-dækning og understøttede funktioner.
  • Parser — parse JavaScript til et typet AST eller ESTree uden at udføre koden.
  • Formatter — formatér JavaScript, JSON og CSS med et layout, der er kompatibelt med prettier.
  • Avanceret — arkitektur, bytecode-VM, benchmarks og oracle-testmodellen.