Pāriet uz saturu

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, XMLHttpRequest un ī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 fetch ar pilnu Fetch funkciju kopu — Request, Response, Headers, pamatdaļas patērētājiem, AbortController/AbortSignal, Blob, File, FormData, EventTarget/Event un pilnu WHATWG Streams (ReadableStream, WritableStream, TransformStream, BYOB, rindas stratēģijas). Īsts HTTP darbojas uzreiz, izmantojot PHP ext-curl.
  • Nodrošina crypto un pilnu SubtleCrypto (SHA saime, HMAC, AES-GCM/CBC/CTR, RSA-OAEP/PSS/PKCS1, ECDSA, ECDH, HKDF, PBKDF2), WebSocket (RFC 6455 un maināms transports) un XMLHttpRequest (veidots virs tā paša fetch transporta).
  • Nodrošina īstu notikumu cilpu: setTimeout, setInterval, clearTimeout, clearInterval, queueMicrotask, kā arī Stage-3 AsyncContext vē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 fetch transportu 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ā main nosū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 pievienots COMPAT.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/phasis failu palaišanai, avota koda izvērtēšanai un AST izdrukāšanai.
  • API — ieguliet Phasis\Engine savā 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.