Przejdź do treści

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, XMLHttpRequest i 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 fetch z pełnym zestawem Fetch — Request, Response, Headers, odbiorcy treści, AbortController/AbortSignal, Blob, File, FormData, EventTarget/Event oraz pełnymi strumieniami WHATWG (ReadableStream, WritableStream, TransformStream, BYOB, strategie kolejkowania). Rzeczywiste HTTP działa od razu dzięki PHP's ext-curl.
  • Dostarcza crypto i pełny SubtleCrypto (rodzina SHA, HMAC, AES-GCM/CBC/CTR, RSA-OAEP/PSS/PKCS1, ECDSA, ECDH, HKDF, PBKDF2), WebSocket (RFC 6455 i wymienny transport) oraz XMLHttpRequest (oparty na tym samym transporcie Fetch).
  • Dostarcza prawdziwą pętlę zdarzeń: setTimeout, setInterval, clearTimeout, clearInterval, queueMicrotask oraz AsyncContext etapu 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 fetch i 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 main oraz 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 do COMPAT.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/phasis do uruchamiania plików, ewaluacji kodu źródłowego i zrzucania AST.
  • API — osadź Phasis\Engine w 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.