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,XMLHttpRequestog 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
fetchmed hele Fetch-familien —Request,Response,Headers, body-forbrugere,AbortController/AbortSignal,Blob,File,FormData,EventTarget/Eventog fulde WHATWG Streams (ReadableStream,WritableStream,TransformStream, BYOB, køstrategier). En rigtig HTTP virker straks via PHPsext-curl. - Leverer
crypto+ fuldSubtleCrypto(SHA-familien, HMAC, AES-GCM/CBC/CTR, RSA-OAEP/PSS/PKCS1, ECDSA, ECDH, HKDF, PBKDF2),WebSocket(RFC 6455 + udskiftelig transport) ogXMLHttpRequest(bygget oven på den samme fetch-transport). - Leverer en rigtig event loop:
setTimeout,setInterval,clearTimeout,clearInterval,queueMicrotasksamt Stage-3AsyncContexttil 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
fetchog 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
mainog 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 tilCOMPAT.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/phasistil at køre filer, evaluere kildekode og udskrive AST'en. - API — indlejr
Phasis\Enginei 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.