Liigu sisu juurde

Phasis

PHP-s kirjutatud JavaScript-mootor: ES2024+ läbib kõik 50,506 test262 testi (2025-05-05 hetktõmmis), lisaks URL, kodeering, structuredClone, fetch ja Streams.

Terminal
composer require phasis/phasis

Viimane väljalase v0.4.2 MIT PHP 8.2+, ext-bcmath, ext-curl, ext-mbstring

Praktikas

Üks mootorobjekt käitab protsessis PHP-t JavaScript-i ning edastab väärtusi mõlemas suunas.

Käivita JavaScript PHP-st

Phasis\Engine hindab lähtekoodistringe ja faile selles PHP protsessis, mis seda kutsub. setGlobal() teisendab PHP massiivid JavaScript massiivideks ja objektideks ning pakendab PHP sulundid funktsioonideks.

console.log väljund puhverdatakse mootoris ja loetakse tagasi meetodiga getConsoleOutput(). Teise vahekaardi vormindaja ei vaja üldse mootorit.

Mootor
use Phasis\Engine;

$engine = new Engine();

// Evaluate an expression
$engine->eval('1 + 2 * 3');                  // 7

// Run a file
$engine->execFile('/path/to/script.js');

// Bridge a PHP value into JS (arrays are copied)
$engine->setGlobal('config', ['debug' => true]);
$engine->eval('config.debug');               // true

// console.log is buffered, not printed
$engine->eval('console.log("hi")');
echo $engine->getConsoleOutput();            // hi

// Expose a PHP closure as a JS function
$engine->setGlobal('greet', fn(string $name) => "Hello, $name");
$engine->eval('greet("world")');             // "Hello, world"

Ainult PHP

Ei mingit exec()-i, FFI-d ega Node'i. Nõuab versiooni PHP 8.2+ koos ext-curli, ext-bcmath-i ja ext-mbstringiga; CI käitab versioone PHP 8.4 ja 8.5.

100% test262

Läbib ECMAScripti vastavustestide komplekti kõik 50 506 testid 2025-05-05 hetktõmmises, kõik kategooriad ja ilma vahelejätmisteta.

Kaasaegne ECMAScript

Klassid, async/await, generaatorid, Symbol, BigInt, Proxy, Temporal, TypedArray ja Intl koos ext-intliga. Täielik ES2024+.

Veebiplatvormi API-d

URL, TextEncoder ja TextDecoder, atob ja btoa, structuredClone, performance ning DOMException on sisseehitatud.

fetch + Streams

Päris HTTP ext-curli kaudu JS-st. Täielik Fetch API koos AbortSignali, Blobi, FormData ja WHATWG Streamsiga.

Veebiplatvormi testid

Imporditud WPT alamtestid fetchi, päiste, blobi, katkestamise, voogude ja kodeeringu jaoks läbivad, välja arvatud brotli ja SharedArrayBufferi juhtumite lubatud loend.

PHP ↔ JS koostalitlus

setGlobal() avaldab PHP sulundid kui JS funktsioonid ning call() käivitab JS funktsioone PHP-st. Väärtused teisendatakse piiril; massiivid kopeeritakse.

Manustatav

Üks Engine-klass: eval, execFile, setGlobal, call. Lisa see mis tahes PHP rakendusse või CLI-i.

Kõnepinu piir

Kindla suurusega 4096 kaadri suurune kõnepinu peatab kontrollimatu rekursiooni ja tekitab tabatava InternalErrori.

CLI

bin/phasis käivitab faili või -e koodijupi ning väljastab AST-i lipuga --ast. Repositooriumi väljavõttes käivitab bin/test262 vastavustestide komplekti.

Node.js kontrollallikas

Stsenaariume kontrollitakse allika Node.js vastu (V8). WPT ja teegi testikomplekt käivitatakse CI-s mootori faile muutvate push'ide korral; kogu test262 läbitakse nõudmisel, viimati 2026-06-09.

Päris teegid

Teste tehakse 204 npm paketiga, nende seas acorn, mustache.js, lodash ja marked; väljund peab baitide kaupa Node'i omaga kattuma.

Miks Phasis

Node.js-protsess puudub

Phasis leksib, parsib ja käivitab JavaScript otse PHP-s, ilma exec() kutseta Node'ile ja ilma FFI-ta. See paigaldatakse paketina Composer.

fetch hosti juhtimise all

fetch() kasutab vaikimisi ext-curli. setFetchTransport() vahetab transpordiviisi, näiteks testides kasutatava maki vastu, ning setFetchPolicy() saab iga päringu enne väljasaatmist tagasi lükata või ümber kirjutada.

Virtuaalaja taimerid

eval() tühjendab sündmussilmuse enne tagastamist ning kell liigub järgmise ootel taimerini, selle asemel et oodata. Pikaealised hostid saavad käitada silmust reaalajas käsuga tickEventLoop().

Parser ja vormindaja kaasas

Parser tagastab tüübistatud PHP AST-i, mida saab eksportida ESTree-vormingus. Vormindaja prindib JavaScript, JSON ja CSS uuesti prettieriga ühilduva paigutusega.

Võrdlus

Muud viisid JavaScript käitamiseks või töötlemiseks PHP rakendusest.

Phasis võrrelduna teiste tööriistadega
Node.js Sobib hästiNode.js käitab JavaScript-i mootoril V8 ja otsib pakette kaustadest node_modules, nii et npm sõltuvused laaditakse nime järgi. Erinevus võrreldes Phasis-gaNode'i kutsumine PHP-st lisab teise käituskeskkonna ja alamprotsessi piiri. Phasis töötab keskkonnas PHP, kuid selle moodulilaadur ei toeta node_modules-i ega package.json ekspordi lahendamist, seega tuleb npm paketid esmalt komplekteerida, näiteks esbuildiga.
V8Js Sobib hästiV8Js manustab Google-i V8 mootori PHP-sse ning käitab JavaScript-i liivakastis, mida saab piirata aja- ja mälulimiidiga. Erinevus võrreldes Phasis-gaV8Js on kompileeritud laiendus, mis vajab libv8 teeki. Phasis on tavaline PHP, mille allikaks on Composer; dokumentatsiooni järgi on selle käitusaeg dispetšerist sõltuva koodi puhul ligikaudu 100 korda pikem kui V8-l.
Peast Sobib hästiPeast parsib JavaScript ESTree AST-iks versioonis PHP 5.4 ja hilisemates ning lisab puu läbimise, selektoripäringud ja renderdamise. Erinevus võrreldes Phasis-gaPhasis nõuab versiooni PHP 8.2. Selle parser tagastab tüübistatud kirjutuskaitstud sõlmeobjekte, mida saab eksportida ESTree-vormingus, ja sama pakett suudab ka koodi käivitada.
Prettier Sobib hästiPrettier vormindab JavaScript, TypeScript, JSX, CSS, HTML, Markdown, YAML ja muud ning paigaldatakse paketist npm. Erinevus võrreldes Phasis-gaPhasis vormindaja toetab ainult JavaScript, JSON ja CSS. Selle suvandid järgivad prettier 3.x-i ning see töötab keskkonnas PHP ilma Node.js-ta.

Küsimused ja vastused

Lühikesed vastused Phasis dokumentatsioonist.

Alustage alustamisjuhendist, seejärel lugege API viidet fetch-konksude ja sündmusetsükli kohta.