Ievads
Phasis ir tīrs PHP JavaScript dzinējs. Tas leksē, parsē un izpilda ECMAScript resursdatora PHP procesā — bez exec('node …'), FFI vai pielāgota binārā paplašinājuma. Tam nepieciešami trīs standarta PHP paplašinājumi: ext-mbstring, ext-bcmath un ext-curl (noklusējuma fetch() transports). ext-intl un ext-openssl nav obligāti. Informāciju par būvējumiem bez bcmath skatiet sadaļā Darba sākšana.
- Iegulstams — ievietojiet JS izpildlaiku jebkurā PHP lietotnē, ietvarā vai CLI rīkā, izmantojot klasi
Phasis\Engine. - Atbilst specifikācijai — iztur oficiālo test262 testu kopu ar 100 % rezultātu visās kategorijās, bez izlaistiem testiem.
- Tīmekļa API — pilna Web Platform Pack (URL, TextEncoder/Decoder, atob/btoa, structuredClone, performance, DOMException), pilna Fetch Pack (fetch, Request, Response, Headers, Body, AbortController/Signal, Blob, File, FormData, EventTarget, pilnas WHATWG Streams, navigator), kā arī
crypto+SubtleCrypto,WebSocket,XMLHttpRequestun īsta notikumu cilpa. Izpilda 100 % importēto Web Platform Tests testu. - Mūsdienīgas iespējas — bultfunkcijas, klases, async/await, Promises, ģeneratori, Symbol, BigInt, Proxy, Reflect, Temporal, Intl, TypedArrays, pilns moduļu atbalsts.
- PHP↔JS mijiedarbība — nododiet PHP skalārus un masīvus uz JS (masīvi tiek kopēti), sasaistiet PHP slēgumus kā JS funkcijas un izsauciet JS funkcijas no PHP. PHP objektus pagaidām nevar koplietot ar JS; skatiet Koplietoti objekti.
Kāpēc radās Phasis
Lietotnēs PHP, kurām jāizpilda lietotāja iesniegts JavaScript — veidņu dzinēji, frontend SSR aizstājēji, datu validācijas noteikumi, satura izolētās vides, bezsaskarnes testu palaidēji — parasti tiek izsaukts ārējs Node.js process vai šī funkcija netiek piedāvāta. Abos gadījumos rodas darbības sarežģītība: otrs izpildlaiks, serializācijas robeža, apakšprocesu cauruļu tīkls un sarežģīta izvietošana koplietotā mitināšanā.
Phasis novērš šo trūkumu. Jūsu PHP kods var leksēt, parsēt un izpildīt JavaScript, izmantojot tikai PHP 8.2+ ar mbstring, bcmath un curl. Dzinējs tiek piegādāts kā Composer pakotne un piedāvā vienkāršu API saskarni.
Ko tas dara
- Ievieš pilnu ECMAScript standarta bibliotēku:
Array,String,Object,Math,JSON,Date,RegExp,Map,Set,Promise,Proxy,Reflect,Symbol,BigInt,TypedArray,Temporal,Intl, ģeneratorus, asinhronos iteratorus, moduļus. - Nodrošina Web Platform API, kurus reālās JS bibliotēkas pārbauda pirms darbības:
URL,URLSearchParams,TextEncoder/TextDecoder,atob/btoa,structuredClone,performance,DOMException. Pilnu iespēju klāstu skatiet sadaļā Tīmekļa API. - Nodrošina
fetchar pilnu Fetch funkciju kopu —Request,Response,Headers, pamatdaļas patērētājiem,AbortController/AbortSignal,Blob,File,FormData,EventTarget/Eventun pilnu WHATWG Streams (ReadableStream,WritableStream,TransformStream, BYOB, rindas stratēģijas). Īsts HTTP darbojas uzreiz, izmantojot PHPext-curl. - Nodrošina
cryptoun pilnuSubtleCrypto(SHA saime, HMAC, AES-GCM/CBC/CTR, RSA-OAEP/PSS/PKCS1, ECDSA, ECDH, HKDF, PBKDF2),WebSocket(RFC 6455 un maināms transports) unXMLHttpRequest(veidots virs tā paša fetch transporta). - Nodrošina īstu notikumu cilpu:
setTimeout,setInterval,clearTimeout,clearInterval,queueMicrotask, kā arī Stage-3AsyncContextvērtību nodošanai pāri asinhronām robežām. - Atbalsta mūsdienīgu sintaksi — destrukturēšanu, spread/rest, aprēķinātus rekvizītus, izvēles ķēdes, nullish koalescēšanu, veidņu literāļus, marķētas veidnes, klases (ar privātiem laukiem, statiskiem blokiem, dekoratoriem), augstākā līmeņa await.
- Pārveido vērtības pāri PHP↔JS robežai. Skalāri un masīvi tiek kopēti, PHP izsaucamās funkcijas kļūst par JS funkcijām, un JS rezultāti tiek atgriezti kā PHP skalāri un masīvi. Precīzus noteikumus skatiet sadaļā Vērtību pārveidošana.
- Darbojas resursdatora kontrolē. Resursdators pārvalda
fetchtransportu un politikas āķus, notikumu cilpa darbojas virtuālajā laikā, bet fiksēts izsaukumu steka ierobežojums aptur nekontrolētu rekursiju. Ir pieejams cilpu iterāciju ierobežojums, taču tas vēl netiek piemērots cilpām, ko izpilda baitu koda virtuālā mašīna; nav arī virkņu garuma, izvades vai reāllaika ierobežojumu. Skatiet API: setLimit. - Tiek pārbaudīts ar Node.js (V8). CI katrā
mainnosūtīšanā un katrā izmaiņu pieprasījumā palaiž vienību un orākula testu kopas; Web Platform Tests un populāro pakotņu testu kopas tiek palaistas, mainot dzinēja avotu. Pilna test262 matrica tiek palaista manuāli, un tās momentuzņēmums tiek pievienotsCOMPAT.md. Skatiet sadaļu Saderība.
Kas tas nav
Phasis nav JIT kompilators. Tas ir koka šķērsošanas interpretētājs ar iespēju izmantot baitu koda virtuālo mašīnu. Darba slodzēs, kuras ierobežo izsaukumu apstrāde, sagaidāms aptuveni 100× ilgāks izpildlaiks nekā V8. Kompromiss ir nulles atkarību, tīrs PHP un resursdatora kontrolēta izpilde — lieliski piemērota JavaScript iegulšanai PHP lietotnēs, kur pareizība un izolācija ir svarīgāka par maksimālu caurlaidspēju.
Ar ko sākt
- Darba sākšana — instalējiet un palaidiet savu pirmo skriptu.
- CLI —
bin/phasisfailu palaišanai, avota koda izvērtēšanai un AST izdrukāšanai. - API — ieguliet
Phasis\Enginesavā PHP lietotnē. - Savietojamība — nododiet PHP vērtības un izsaucamās funkcijas uz JavaScript.
- Saderība — test262 pārklājums un atbalstītās funkcijas.
- Parsētājs — parsējiet JavaScript par tipizētu AST vai ESTree, to neizpildot.
- Formatētājs — formatējiet JavaScript, JSON un CSS ar prettier saderīgu izkārtojumu.
- Papildu informācija — arhitektūra, baitu koda virtuālā mašīna, etalonmērījumi un orākula testēšanas modelis.