Liigu sisu juurde

Teadaolevad piirangud

Phasis eesmärk on käituda igas jälgitavas spetsifikatsioonitestis täpselt nagu V8. Sellel lehel on loetletud kohad, kus praktikas see sarnasus lõpeb — tavaliselt puu läbiva PHP interpretaatori ja JIT-kompileeritud C++ mootori põhimõtteliste erinevuste tõttu.

Jõudluse piir

Mootor kasutab puud läbivat interpretaatorit, võimaluse korral baitkoodi VM-i ja JsToPhp transpilaatorit, mis teisendab arvutusmahukad või lokaale rohkelt kasutavad koodiplokid (sh kujundid obj.method(), new Ctor() ja this.member) natiivseteks PHP sulunditeks, mida PHP 8.5 jälgiv JIT saab masinkoodiks kompileerida. Suurem osa sagedasi väljakutseid toimub VM-i lülitustsüklis või otse JIT-kompileeritud kujul PHP — AST-d ei läbita —, kuid iga VM-i opkood maksab endiselt PHP väljakutse lisakulu ning iga kujund, mida JsToPhp veel ei toeta, langeb tagasi aeglasema VM-i juurde. Väljakutsemahukate töökoormuste jõudluspiir on ligikaudu 100× aeglasem kui V8.

Manustatud töökoormuste puhul — kasutaja antud loogika käivitamine PHP andmetel, sisu teisendamise torujuhtmed ja valideerimisreeglid — on see piir harva oluline. V8 võtab 100 ms; Phasis võtab 10 s; mõlemad jäävad päringu ajalõpust kaugele allapoole. Lõhe vähendamiseks tuleks JsToPhp-le õpetada rohkem kujundeid (parameetrite tüübijäreldus, await / yield* teisendamine) või väljastada opcache'i opkoode otse, mitte läbi eval(). Vt Võrdlusnäitajad § Teekaart.

Mitme agendi samaaegsus

JavaScript mudel SharedArrayBuffer + Atomics.wait + postMessage eeldab, et host saab käivitada päris operatsioonisüsteemi lõimi. PHP seda ei suuda (ilma pcntl_fork-ta, mis pole kõigis hostides saadaval).

Phasis simuleerib üht agenti — Atomics.wait tagastab kohe väärtuse "not-equal" või "timed-out", notify tagastab alati 0. See läbib kõik ühe agendiga käivitatavad test262 testid (sisendi valideerimine, veateed, tühiteavitus), mis moodustavad 376 Atomicsi testidest 376.

Teste, mille puhul kaks samaaegset agenti peavad teineteist jälgima, ei toetata. Päris paralleelsuse jaoks kasutage PHP taseme töötajajärjekorda (Redis, Beanstalkd, …).

Realm'i semantika

ShadowRealm on teostatud, kuid iga alamrealm töötab hostiga samas PHP protsessis. Hostifunktsioonid võivad viiteid realm'ide vahel lekitada, kui te ei hoia PHP koodi hoolikalt isoleerituna. Spetsifikatsioon lubab seda; V8 tagab rangema isolatsiooni eraldi v8::Isolate'i eksemplaridega.

createRealm() (test262 hostikonks) loob sisemiselt uue Phasis\Engine-i ja ühendab standardteegi.

Regulaaravaldiste mootori valik

Phasis kasutab peamise regulaaravaldiste taustsüsteemina PHP PCRE2-te ning kohandatud sobitajat juhuks, kui PCRE2 ei saa täpselt hakkama (salvestustega tagasivaatamine, lähtestamisega kvantifitseeritud rühmad, teatud /v-lipu semantika). Kohandatud sobitaja on PCRE2-st aeglasem ja seda kasutatakse vaid siis, kui mustri kontroll tuvastab ühildumatuse.

Oluline tagajärg: PCRE2 väiketähtedeks teisendamise tabel võib erineda V8 ICU versioonist, eriti vanemates Linux distributsioonides (Ubuntu 22.04 sisaldab ICU 70; Phasis komplekteerib ICU 76+ teisendustabeli, et vältida hosti erinevusi /iu mustrite korral).

Mälumudel

PHP viiteloendusel põhinev prügi kogumine erineb V8 jälitavast kogujast. Hostisulundite hõivatud PHP objektid püsivad elus seni, kuni mootor hoiab neid sulundeid alles, ning nendevahelisi tsükleid ei koguta enne, kui Engine hävitatakse. Kasutage vahemälude jaoks WeakMap / WeakRef, mida te ei soovi elus hoida.

process.memoryUsage() ja sarnased V8-spetsiifilised introspektsiooni API-d pole teostatud.

Moodulilaadija

ES-moodulite laadija lahendab suhtelised impordid failisüsteemi põhjal, kuid ei tunne pakendajate tavasid:

  • Puudub node_modules lahendamine.
  • Puudub package.json exports kaart.
  • Faililaiendit ei tuletata (kirjutage import './foo.mjs', mitte import './foo').
  • HTTP importi ei toetata.

See vastab ECMAScripti põhispetsifikatsioonile, kuid mitte Node'i käitumisele. Kohandatud moodulilahendaja jaoks konksu pole. npm pakettide kasutamiseks pakendage need tööriistaga nagu esbuild üheks skriptiks või mooduliks, enne kui annate selle Phasis-le.

Wasm

WebAssembly pole teostatud. Sidumiseks puudub PHP WebAssembly käituskeskkond.

Brauseripõhised veebi API-d, mida ei toetata

Phasis sisaldab täielikku Web Platform Pack-i (URL, TextEncoder/TextDecoder, atob/btoa, structuredClone, performance, DOMException), täielikku Fetch Pack-i (fetch, Request, Response, Headers, Body, AbortController/AbortSignal, Blob/File, FormData, EventTarget/Event, täielikud WHATWG Streams, navigator) ning crypto (getRandomValues, randomUUID, täielik SubtleCrypto: digest, HMAC, AES-GCM/CBC/CTR, RSA-OAEP/PSS/PKCS1, ECDSA, ECDH, HKDF, PBKDF2), WebSocket (konstruktor + RFC 6455 kaadrikodek, vahetatav transport), XMLHttpRequest (fetch-transpordi peal) ja päris sündmussilmuse (setTimeout, setInterval, clearTimeout, clearInterval, queueMicrotask, AsyncContext). Vt Veebi API-d.

Mida ei sisaldu:

  • window, document, DOM-puu — Phasis pole brauser.
  • localStorage, sessionStorage, IndexedDB — hosti ülesanded; püsimälu eest vastutab manustaja.
  • Worker, SharedWorker, MessageChannel — vajavad päris operatsioonisüsteemi lõimi, mida PHP ei paku.
  • Service Workers, Push API, Notifications, BroadcastChannel — väljaspool brauserit ebaolulised.

Node'i globaalsed muutujad

process, Buffer, __dirname, __filename, require() — neidki pole olemas. Need on Node'i hosti tavad, mitte keele omadused.

Kui teisaldate Node'i koodi, asendage require('foo') väärtusega import 'foo', asendage process.env.X hostiga seotud env.X-ga ning andke __dirname-ga samaväärsed rajad ette saidilt PHP.

Kümnendmurdude täpsus

ECMAScripti arvud on IEEE 754 topelttäpsusega arvud. Rohkem kui 15 tüvenumbriga kümnendarvutuste täpsus väheneb samamoodi nagu kõigis teistes JS mootorites. Täisarvude täpseks arvutamiseks kasutage BigInt-i; täpsete murdarvutuste jaoks kasutage JS kümnendarvuteeki.

PHP bcmath-i kasutatakse sisemiselt BigInt jaoks; ainus tegelik erinevus V8-ga võrreldes on see, et väga suurte bigint-tehete tegemine on PHP-s aeglasem kui V8 C++ teostuses. Arvutustäpsus on sama.