Wprowadzenie
Phasis to czysty, oparty na PHP silnik JavaScript. Analizuje leksykalnie, parsuje i wykonuje ECMAScript w procesie hosta PHP — bez exec('node …'), FFI ani niestandardowego rozszerzenia binarnego. Wymaga trzech standardowych rozszerzeń PHP: ext-mbstring, ext-bcmath i ext-curl (domyślnego transportu fetch()). ext-intl i ext-openssl są opcjonalne. Informacje o kompilacjach bez bcmath znajdziesz w sekcji Pierwsze kroki.
- Możliwość osadzania — dodaj środowisko uruchomieniowe JS do dowolnej aplikacji PHP, frameworka lub narzędzia CLI za pomocą klasy
Phasis\Engine. - Zgodność ze specyfikacją — przechodzi oficjalny zestaw testów test262 w 100 %, wszystkie kategorie, bez pominięć.
- Interfejsy Web API — pełny Web Platform Pack (URL, TextEncoder/Decoder, atob/btoa, structuredClone, performance, DOMException), pełny Fetch Pack (fetch, Request, Response, Headers, Body, AbortController/Signal, Blob, File, FormData, EventTarget, pełne strumienie WHATWG, navigator), a także
crypto+SubtleCrypto,WebSocket,XMLHttpRequesti rzeczywista pętla zdarzeń. Zaimplementowano 100 % zaimportowanych testów Web Platform Tests. - Nowoczesny zakres funkcji — funkcje strzałkowe, klasy, async/await, Promises, generatory, Symbol, BigInt, Proxy, Reflect, Temporal, Intl, TypedArrays, pełna obsługa modułów.
- Współdziałanie PHP↔JS — przekazuj skalarne wartości PHP i tablice do JS (tablice są kopiowane), wiąż domknięcia PHP jako funkcje JS i wywołuj funkcje JS z poziomu PHP. Obiektów PHP nie można jeszcze współdzielić z JS; zobacz Współdzielone obiekty.
Dlaczego powstał Phasis
Aplikacje PHP, które muszą uruchamiać dostarczony przez użytkownika kod JavaScript — silniki szablonów, nakładki SSR frontendu, reguły walidacji danych, piaskownice treści, bezgłowe narzędzia do testów — zwykle uruchamiają zewnętrznie Node.js albo pomijają tę funkcję. Oba rozwiązania zwiększają złożoność operacyjną: drugie środowisko uruchomieniowe, granica serializacji, sieć potoków procesów potomnych oraz trudne wdrażanie na współdzielonym hostingu.
Phasis wypełnia tę lukę. Kod PHP może analizować leksykalnie, parsować i wykonywać JavaScript, korzystając wyłącznie z PHP 8.2+ oraz mbstring, bcmath i curl. Silnik jest dostarczany jako pakiet Composer i udostępnia niewielki, jednolity interfejs API.
Funkcje
- Implementuje pełną bibliotekę standardową ECMAScript:
Array,String,Object,Math,JSON,Date,RegExp,Map,Set,Promise,Proxy,Reflect,Symbol,BigInt,TypedArray,Temporal,Intl, generatory, iteratory asynchroniczne, moduły. - Dostarcza interfejsy API Web Platform, które biblioteki JS często sprawdzają w pierwszej kolejności:
URL,URLSearchParams,TextEncoder/TextDecoder,atob/btoa,structuredClone,performance,DOMException. Pełny zakres znajdziesz w sekcji Interfejsy Web API. - Dostarcza
fetchz pełnym zestawem Fetch —Request,Response,Headers, odbiorcy treści,AbortController/AbortSignal,Blob,File,FormData,EventTarget/Eventoraz pełnymi strumieniami WHATWG (ReadableStream,WritableStream,TransformStream, BYOB, strategie kolejkowania). Rzeczywiste HTTP działa od razu dzięki PHP'sext-curl. - Dostarcza
cryptoi pełnySubtleCrypto(rodzina SHA, HMAC, AES-GCM/CBC/CTR, RSA-OAEP/PSS/PKCS1, ECDSA, ECDH, HKDF, PBKDF2),WebSocket(RFC 6455 i wymienny transport) orazXMLHttpRequest(oparty na tym samym transporcie Fetch). - Dostarcza prawdziwą pętlę zdarzeń:
setTimeout,setInterval,clearTimeout,clearInterval,queueMicrotaskorazAsyncContextetapu 3 do przekazywania wartości między granicami operacji asynchronicznych. - Obsługuje nowoczesną składnię — destrukturyzację, spread/rest, właściwości obliczane, opcjonalne łańcuchowanie, operator koalescencji nullish, literały szablonowe, szablony z tagiem, klasy (z polami prywatnymi, blokami statycznymi i dekoratorami), await na najwyższym poziomie.
- Konwertuje wartości na granicy PHP↔JS. Skalary i tablice są kopiowane do środowiska, wywoływalne elementy PHP stają się funkcjami JS, a wyniki JS wracają jako skalary i tablice PHP. Dokładne reguły opisano w sekcji Konwersja wartości.
- Działa pod kontrolą hosta. Host zarządza transportem
fetchi punktami kontrolnymi polityk, pętla zdarzeń działa w czasie wirtualnym, a stały limit stosu wywołań zatrzymuje niekontrolowaną rekurencję. Dostępny jest limit liczby iteracji pętli, ale nie jest jeszcze egzekwowany dla pętli uruchamianych przez maszynę wirtualną kodu bajtowego; nie ma też limitów długości ciągów, wyjścia ani czasu rzeczywistego. Zobacz API: setLimit. - Jest weryfikowany względem Node.js (V8). CI uruchamia zestawy testów jednostkowych i testów z użyciem wzorca po każdym wypchnięciu zmian do
mainoraz przy każdym pull requeście, a także testy Web Platform Tests i popularnych pakietów przy zmianach kodu źródłowego silnika; pełna macierz test262 jest uruchamiana ręcznie, a jej migawka trafia doCOMPAT.md. Zobacz Zgodność.
Czym nie jest
Phasis nie jest kompilatorem JIT. To interpreter przechodzący po drzewie z opportunistyczną maszyną wirtualną kodu bajtowego. W zadaniach ograniczonych szybkością wysyłania oczekuj czasu wykonania ~100× dłuższego niż w V8. Kompromisem są zerowe zależności, czysty PHP i wykonanie kontrolowane przez hosta — idealne do osadzania JavaScript w aplikacjach PHP, gdzie poprawność i izolacja są ważniejsze niż surowa przepustowość.
Od czego zacząć
- Pierwsze kroki — instalacja i uruchomienie pierwszego skryptu.
- CLI —
bin/phasisdo uruchamiania plików, ewaluacji kodu źródłowego i zrzucania AST. - API — osadź
Phasis\Enginew swojej aplikacji PHP. - Współdziałanie — przekazywanie wartości i funkcji wywoływalnych PHP do JavaScript.
- Zgodność — pokrycie test262 i obsługiwane funkcje.
- Parser — parsowanie JavaScript do typowanego AST lub ESTree bez wykonywania kodu.
- Formater — formatowanie JavaScript, JSON i CSS z układem zgodnym z prettier.
- Zaawansowane — architektura, maszyna wirtualna kodu bajtowego, testy wydajności i model testowania z użyciem wzorca.