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.
composer require phasis/phasisViimane väljalase v0.4.2 MIT PHP 8.2+, ext-bcmath, ext-curl, ext-mbstring
./vendor/bin/phasis -e '1 + 2 * 3'
# 7
./vendor/bin/phasis -e '[1, 2, 3].map(x => x * x).join(",")'
# 1,4,9
./vendor/bin/phasis path/to/script.jsPraktikas
Ü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.
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"use Phasis\Formatter\Formatter;
use Phasis\Formatter\FormatOptions;
$formatted = Formatter::formatSource(
"const a={x:1,y:2};",
'script',
new FormatOptions(useTabs: true, singleQuote: true),
);
// "const a = { x: 1, y: 2 };\n"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.
| Tööriist | Sobib hästi | Erinevus võrreldes Phasis-ga |
|---|---|---|
| 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.
Composer vajab versiooni PHP 8.2 või uuemat koos bcmath, curl ja mbstringiga. Intl API-de ja mitte-ISO Temporal-kalendrite jaoks soovitatakse intl-i, crypto.subtle AES-krüpteerimiseks openssl-i.
Phasis on baitkoodi VM-iga puu läbiv interpretaator, mitte JIT. Dokumentatsiooni järgi on selle käitusaeg dispetšerist sõltuva koodi puhul ligikaudu 100 korda pikem kui V8-l; selle piiri tähtsus on manustamisel, näiteks valideerimisreeglite korral, nende sõnul harv.
Nime järgi mitte. Moodulilaadur lahendab impordid failisüsteemi põhjal, nõuab faililaiendeid ning ei toeta node_modules-i ega package.json ekspordi lahendamist. Seega komplekteeri pakett näiteks esbuildiga ja anna komplekt meetodile Phasis.
Ei. window, document ega DOM-puu ei kuulu paketti, samuti mitte Node'i globaalsed objektid nagu process, Buffer ja require().
See puhverdatakse mootoris, mitte ei prindita. Loe seda meetodiga getConsoleOutput() või getConsoleLines() ning tühjenda puhver meetodiga clearConsole().
Püüdmata jäänud viske tulemus kuvatakse kujul Phasis\Exceptions\JsThrowable. Mootori enda tekitatud vead, näiteks null-väärtuse omaduse lugemine, kuvatakse kujul Phasis\Exceptions\TypeError, ReferenceError või RangeError ning kõik need pärivad Phasis\Exceptions\RuntimeError-i. Vigane lähtekood põhjustab vea Phasis\Parser\ParseError, mis on Phasis\Exceptions\SyntaxError koos rea, veeru ja nihkega.
Alustage alustamisjuhendist, seejärel lugege API viidet fetch-konksude ja sündmusetsükli kohta.