Johdanto
Phasis on puhdas-PHP JavaScript-moottori. Se jäsentää leksikaalisesti, jäsentää ja suorittaa ECMAScript-koodia isännän PHP-prosessissa ilman exec('node …')-toimintoa, FFI:tä tai mukautettua binäärilaajennusta. Se tarvitsee kolme tavallista PHP-laajennusta: ext-mbstring, ext-bcmath ja ext-curl (oletusarvoinen fetch()-siirtotapa). ext-intl ja ext-openssl ovat valinnaisia. Katso Aloittaminen koontiversioita varten, joista bcmath on jätetty pois.
- Upotettava — lisää JS-ajoympäristö mihin tahansa PHP-sovellukseen, kehykseen tai CLI-työkaluun
Phasis\Engine-luokan avulla. - Määrittelyn mukainen — läpäisee virallisen test262-testisarjan kattavuudella 100 %, kaikissa luokissa ilman ohituksia.
- Verkko-API:t — täysi Web Platform -paketti (URL, TextEncoder/Decoder, atob/btoa, structuredClone, performance, DOMException), täysi Fetch-paketti (fetch, Request, Response, Headers, Body, AbortController/Signal, Blob, File, FormData, EventTarget, täydet WHATWG Streams -rajapinnat, navigator) sekä
crypto+SubtleCrypto,WebSocket,XMLHttpRequestja oikea tapahtumasilmukka. 100 % tuoduista Web Platform Test -testeistä läpäistään. - Moderni rajapinta — nuolifunktiot, luokat, async/await, Promises, generaattorit, Symbol, BigInt, Proxy, Reflect, Temporal, Intl, TypedArrays ja täysi moduulituki.
- PHP↔JS-yhteentoimivuus — välitä PHP-skalaarit ja taulukot kohteeseen JS (taulukot kopioidaan), sido PHP-sulkeumat JS-funktioiksi ja kutsu JS-funktioita kohteesta PHP. PHP-olioita ei vielä voi jakaa kohteen JS kanssa; katso Jaetut oliot.
Miksi Phasis on olemassa
PHP-sovellukset, joiden täytyy suorittaa käyttäjän antamaa JavaScript-koodia — kuten mallinnusmoottorit, käyttöliittymän SSR-sovittimet, tietojen validointisäännöt, sisällön hiekkalaatikot ja headless-testiajurit — kutsuvat yleensä ulkoisesti kohdetta Node.js tai jättävät ominaisuuden toteuttamatta. Kumpikin vaihtoehto lisää ylläpidon monimutkaisuutta: toisen ajoympäristön, sarjallistamisrajan, aliprosessien putkiverkoston ja haastavan käyttöönoton jaetuissa palveluympäristöissä.
Phasis paikkaa tämän puutteen. PHP-koodisi voi jäsentää leksikaalisesti, jäsentää ja suorittaa kohdetta JavaScript käyttäen vain kohdetta PHP 8.2+ sekä kohteita mbstring, bcmath ja curl. Moottori toimitetaan Composer-pakettina, ja se tarjoaa pienen, yhtenäisen API-rajapinnan.
Mitä se tekee
- Toteuttaa koko ECMAScript-standardikirjaston:
Array,String,Object,Math,JSON,Date,RegExp,Map,Set,Promise,Proxy,Reflect,Symbol,BigInt,TypedArray,Temporal,Intl, generaattorit, asynkroniset iteraattorit ja moduulit. - Toimittaa Web Platform -rajapinnat, joiden olemassaolon oikeat JS-kirjastot tarkistavat ennakkoon:
URL,URLSearchParams,TextEncoder/TextDecoder,atob/btoa,structuredClone,performance,DOMException. Katso Verkko-API:t koko rajapinnasta. - Toimittaa
fetch-paketin koko Fetch-toimintoperheellä —Request,Response,Headers, rungon lukutoiminnot,AbortController/AbortSignal,Blob,File,FormData,EventTarget/Eventsekä täydet WHATWG Streams -rajapinnat (ReadableStream,WritableStream,TransformStream, BYOB ja jonotusstrategiat). Oikea HTTP toimii heti käyttövalmiina kohteen PHPext-curl-toiminnon kautta. - Toimittaa
crypto-rajapinnan ja kokoSubtleCrypto-kokonaisuuden (SHA-perhe, HMAC, AES-GCM/CBC/CTR, RSA-OAEP/PSS/PKCS1, ECDSA, ECDH, HKDF, PBKDF2),WebSocket-rajapinnan (RFC 6455 sekä vaihdettava siirtotapa) jaXMLHttpRequest-rajapinnan (joka käyttää samaa fetch-siirtotapaa). - Toimittaa oikean tapahtumasilmukan:
setTimeout,setInterval,clearTimeout,clearInterval,queueMicrotasksekä Stage-3-rajapinnanAsyncContextarvojen välittämiseen asynkronisten rajojen yli. - Tukee modernia syntaksia: hajotelman määritykset, levitys/rest, lasketut ominaisuudet, valinnainen ketjutus, null-arvon yhdistäminen, mallimerkkijonot, nimikoidut mallimerkkijonot, luokat (yksityisine kenttineen, staattisine lohkoineen ja koristeineen) sekä ylätason await.
- Muuntaa arvoja kohteiden PHP ja JS välillä. Skalaarit ja taulukot kopioidaan sisään, kohteen PHP kutsuttavat muunnetaan JS-funktioiksi, ja kohteen JS tulokset palautetaan PHP-skaalareina ja -taulukoina. Tarkat säännöt ovat sivulla Arvojen muuntaminen.
- Suoritus tapahtuu isännän hallinnassa. Isäntä omistaa
fetch-siirtotavan ja käytäntöliitännät, tapahtumasilmukka toimii virtuaaliajassa ja kiinteä kutsupinon yläraja pysäyttää hallitsemattoman rekursion. Silmukoiden iteraatiorajoitus on olemassa, mutta sitä ei vielä valvota tavukoodi-VM:n suorittamissa silmukoissa. Merkkijonon pituudelle, tulosteelle tai seinäajalle ei ole rajoituksia; katso API: setLimit. - Varmennetaan kohteen Node.js (V8) avulla. CI suorittaa yksikkö- ja oraakkelitestit jokaisella kohteeseen
maintulevalla päivityksellä ja jokaisella vetopyynnöllä sekä Web Platform Tests -testit ja suosittujen pakettien testisarjat aina, kun moottorin lähdekoodi muuttuu. Koko test262-testimatriisi suoritetaan käsin, ja sen tilannekuva tallennetaan kohteeseenCOMPAT.md. Katso Yhteensopivuus.
Mitä se ei ole
Phasis ei ole JIT-kääntäjä. Se on puuta kulkeva tulkki, jossa on tilaisuuden mukaan käytettävä tavukoodi-VM. Odota noin 100× kohteen V8 suoritusajasta suoritusvuoron valintaan painottuvissa kuormissa. Vastineeksi saat nolla riippuvuutta, puhtaan kohteen PHP ja isännän hallitseman suorituksen — täydellinen tapa upottaa JavaScript kohteen PHP sovelluksiin, joissa oikeellisuus ja eristys ovat raakaa suorituskykyä tärkeämpiä.
Mistä aloittaa
- Aloittaminen — asenna ja suorita ensimmäinen skriptisi.
- CLI —
bin/phasistiedostojen suorittamiseen, lähdekoodin arviointiin ja AST:n tulostamiseen. - API — upota
Phasis\EnginePHP-sovellukseesi. - Yhteentoimivuus — välitä PHP-arvoja ja kutsuttavia kohteeseen JavaScript.
- Yhteensopivuus — test262-kattavuus ja tuetut ominaisuudet.
- Jäsennin — jäsennä JavaScript tyypitetyksi AST:ksi tai ESTreeksi suorittamatta sitä.
- Muotoilija — muotoile JavaScript, JSON ja CSS Prettier-yhteensopivalla asettelulla.
- Lisäominaisuudet — arkkitehtuuri, tavukoodi-VM, vertailutestit ja oraakkelitestauksen malli.