Siirry sisältöön

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, XMLHttpRequest ja 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/Event sekä täydet WHATWG Streams -rajapinnat (ReadableStream, WritableStream, TransformStream, BYOB ja jonotusstrategiat). Oikea HTTP toimii heti käyttövalmiina kohteen PHP ext-curl-toiminnon kautta.
  • Toimittaa crypto-rajapinnan ja koko SubtleCrypto-kokonaisuuden (SHA-perhe, HMAC, AES-GCM/CBC/CTR, RSA-OAEP/PSS/PKCS1, ECDSA, ECDH, HKDF, PBKDF2), WebSocket-rajapinnan (RFC 6455 sekä vaihdettava siirtotapa) ja XMLHttpRequest-rajapinnan (joka käyttää samaa fetch-siirtotapaa).
  • Toimittaa oikean tapahtumasilmukan: setTimeout, setInterval, clearTimeout, clearInterval, queueMicrotask sekä Stage-3-rajapinnan AsyncContext arvojen 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 main tulevalla 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 kohteeseen COMPAT.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/phasis tiedostojen suorittamiseen, lähdekoodin arviointiin ja AST:n tulostamiseen.
  • API — upota Phasis\Engine PHP-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.