Įvadas
Phasis yra grynai PHP pagrįstas JavaScript variklis. Jis skaido, analizuoja ir vykdo ECMAScript pagrindiniame PHP procese — be exec('node …'), FFI ar pasirinktinio dvejetainio plėtinio. Reikia trijų standartinių PHP plėtinių: ext-mbstring, ext-bcmath ir ext-curl (numatytoji fetch() transporto priemonė). ext-intl ir ext-openssl pasirenkami. Apie darinius, kuriuose nėra bcmath, žr. Darbo pradžia.
- Įterpiamas — įterpkite JS vykdymo aplinką į bet kurią PHP programą, karkasą ar CLI įrankį per
Phasis\Engineklasę. - Atitinka specifikaciją — oficialių test262 testų rezultatai: 100 %, visos kategorijos, be praleistų testų.
- Žiniatinklio API — visas Web Platform Pack (URL, TextEncoder/Decoder, atob/btoa, structuredClone, performance, DOMException), visas Fetch Pack (fetch, Request, Response, Headers, Body, AbortController/Signal, Blob, File, FormData, EventTarget, visi WHATWG Streams, navigator), taip pat
crypto+SubtleCrypto,WebSocket,XMLHttpRequestir tikras įvykių ciklas. Sėkmingai įvykdoma 100 % importuotų Web Platform Tests. - Šiuolaikinė sąsaja — rodyklių funkcijos, klasės, async/await, Promises, generatoriai, Symbol, BigInt, Proxy, Reflect, Temporal, Intl, TypedArrays, visiškas modulių palaikymas.
- PHP↔JS sąveika — perduokite PHP skaliarus ir masyvus į JS (masyvai nukopijuojami), susiekite PHP uždarymus kaip JS funkcijas ir iš PHP iškvieskite JS funkcijas. PHP objektų kol kas negalima bendrinti su JS; žr. Bendrinami objektai.
Kodėl sukurtas Phasis
PHP programoms, kurioms reikia vykdyti naudotojų pateiktą JavaScript kodą, pavyzdžiui, šablonų varikliams, frontend SSR pakaitalams, duomenų tikrinimo taisyklėms, turinio smėlio dėžėms ir begalvėms testų vykdymo priemonėms, paprastai tenka iškviesti Node.js iš komandinės eilutės arba atsisakyti šios funkcijos. Abiem atvejais didėja veiklos sudėtingumas: reikia antros vykdymo aplinkos, serializavimo ribos ir tarpusavyje susietų antrinių procesų kanalų, o diegimas bendrojo naudojimo priegloboje tampa sudėtingesnis.
Phasis užpildo šią spragą. Jūsų PHP kodas gali skaidyti, analizuoti ir vykdyti JavaScript naudodamas tik PHP 8.2+ su mbstring, bcmath ir curl. Variklis pateikiamas kaip Composer paketas ir turi nedidelę API sąsają.
Ką jis daro
- Įgyvendina visą ECMAScript standartinę biblioteką:
Array,String,Object,Math,JSON,Date,RegExp,Map,Set,Promise,Proxy,Reflect,Symbol,BigInt,TypedArray,Temporal,Intl, generatorius, asinchronines iteracijas, modulius. - Pateikia žiniatinklio platformos API, kurias realiame pasaulyje naudojamos JS bibliotekos iš anksto tikrina:
URL,URLSearchParams,TextEncoder/TextDecoder,atob/btoa,structuredClone,performance,DOMException. Visą sąsają rasite skiltyje Žiniatinklio API. - Pateikia
fetchsu visa Fetch API šeima —Request,Response,Headers, turinio skaitymo priemonėmis,AbortController/AbortSignal,Blob,File,FormData,EventTarget/Eventir visais WHATWG srautais (ReadableStream,WritableStream,TransformStream, BYOB, eilių strategijomis). Tikras HTTP veikia iškart, naudojant PHPext-curl. - Pateikia
cryptoir visąSubtleCrypto(SHA šeimą, HMAC, AES-GCM/CBC/CTR, RSA-OAEP/PSS/PKCS1, ECDSA, ECDH, HKDF, PBKDF2),WebSocket(RFC 6455 ir keičiamą transportą) beiXMLHttpRequest(veikia tuo pačiu Fetch transportu). - Pateikia tikrą įvykių ciklą:
setTimeout,setInterval,clearTimeout,clearInterval,queueMicrotaskir Stage-3AsyncContext, skirtą reikšmėms perduoti per asinchronines ribas. - Palaiko šiuolaikinę sintaksę: destruktūrizavimą, spread/rest, apskaičiuojamas ypatybes, pasirenkamą grandinės operatorių, nullish coalescing, šablonų eilutes, žymėtus šablonus, klases (su privačiais laukais, statiniais blokais ir dekoratoriais), aukščiausio lygio await.
- Konvertuoja reikšmes per PHP↔JS ribą. Skaliarinės reikšmės ir masyvai nukopijuojami, PHP iškviečiamosios reikšmės tampa JS funkcijomis, o JS rezultatai grąžinami kaip PHP skaliarinės reikšmės ir masyvai. Tikslios taisyklės pateiktos skiltyje Reikšmių konvertavimas.
- Vykdomas valdomas pagrindinės aplinkos. Pagrindinė aplinka valdo
fetchtransportą ir strategijos kabliukus, įvykių ciklas veikia virtualiuoju laiku, o fiksuota iškvietimų dėklo riba sustabdo nevaldomą rekursiją. Ciklo iteracijų riba yra, tačiau kol kas ji netaikoma baitkodą vykdančio VM ciklams; taip pat nėra eilučių ilgio, išvesties ar sieninio laikrodžio apribojimų. Žr. : setLimitAPI. - Tikrinamas pagal Node.js (V8). CI vykdo vienetų ir etaloninius testus su kiekvienu siuntimu į
mainir kiekvienu ištraukimo prašymu, o žiniatinklio platformos testus ir populiarių paketų rinkinius — pasikeitus variklio šaltinio kodui; visą test262 matricą paleidžia žmogus ir jos momentinę kopiją įrašo įCOMPAT.md. Žr. Suderinamumas.
Kas tai nėra
Phasis nėra JIT kompiliatorius. Tai medį pereinantis interpretatorius su proginiu baitkodo VM. Tikėkitės, kad su išsiuntimu susietuose darbo krūviuose jis veiks maždaug 100× lėčiau nei V8. Kompromisas – nėra jokių priklausomybių, naudojamas grynas PHP, o vykdymą valdo pagrindinė programa. Puikiai tinka įterpti JavaScript į PHP programas, kur teisingumas ir izoliacija svarbiau už maksimalų našumą.
Nuo ko pradėti
- Darbo pradžia — įdiekite ir paleiskite savo pirmąjį scenarijų.
- CLI —
bin/phasisfailams paleisti, kodui įvertinti ir AST išvesti. - API — įterpkite
Phasis\Engineį savo PHP programą. - Sąveika — perduokite PHP reikšmes ir iškviečiamuosius objektus į JavaScript.
- Suderinamumas — test262 aprėptis ir palaikomos funkcijos.
- Analizatorius — išanalizuokite JavaScript į tipizuotą AST arba ESTree jo nevykdydami.
- Formatuoklis — formatuokite JavaScript, JSON ir CSS naudodami su prettier suderinamą maketą.
- Išplėstinės temos — architektūra, baitkodo VM, našumo palyginimai ir etaloninio testavimo modelis.