Phasis
PHP ile yazılmış bir JavaScript motoru: ES2024+ için 50 506 test262 testinin tümünü geçer (2025-05-05 tarihli anlık görüntü); ayrıca URL, kodlama, structuredClone, fetch ve Streams içerir.
composer require phasis/phasisEn son sürüm 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.jsUygulamada
Tek bir motor nesnesi, PHP süreci içinde JavaScript çalıştırır ve değerleri her iki yönde de aktarır.
PHP üzerinden JavaScript çalıştırın
Phasis\Engine, kaynak dizgelerini ve dosyaları kendisini çağıran PHP sürecinde değerlendirir. setGlobal(), PHP dizilerini JavaScript dizilerine ve nesnelere dönüştürür, ayrıca PHP kapatmalarını işlev olarak sarar.
console.log çıktısı motorda arabelleğe alınır ve getConsoleOutput() ile okunur. İkinci sekmedeki biçimlendirici için motor gerekmez.
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"Saf PHP
exec() yok, FFI yok, Node yok. ext-curl, ext-bcmath ve ext-mbstring ile PHP 8.2+ gerektirir; CI, PHP 8.4 ve 8.5 kullanır.
100% test262
ECMAScript uygunluk test paketinin 2025-05-05 tarihli anlık görüntüsündeki 50 506 testin tümünü her kategoride eksiksiz geçer.
Modern ECMAScript
Sınıflar, async/await, üreteçler, Symbol, BigInt, Proxy, Temporal, TypedArray ve ext-intl ile Intl. Tam ES2024+.
Web Platformu API'leri
URL, TextEncoder ve TextDecoder, atob ve btoa, structuredClone, performance ve DOMException yerleşik olarak sunulur.
fetch + Streams
ext-curl üzerinden JS kaynaklı gerçek HTTP. AbortSignal, Blob, FormData ve WHATWG Streams ile tam Fetch API.
Web Platformu Testleri
fetch, headers, blob, abort, streams ve encoding için içe aktarılan WPT alt testleri, brotli ve SharedArrayBuffer durumlarına ilişkin izin listesindekiler dışında geçer.
PHP ↔ JS birlikte çalışabilirliği
setGlobal(), PHP kapatmalarını JS işlevleri olarak sunar; call() ise PHP kaynaklı JS işlevlerini çalıştırır. Değerler sınırda dönüştürülür; diziler kopyalanır.
Gömülebilir
Tek Engine sınıfı: eval, execFile, setGlobal, call. Herhangi bir PHP uygulamasına veya CLI içine ekleyin.
Çağrı Yığını Sınırı
Sabit 4 096 çerçeveli çağrı yığını, denetlenemeyen özyinelemeyi yakalanabilir bir InternalError ile durdurur.
CLI
bin/phasis bir dosyayı veya -e kod parçacığını çalıştırır ve --ast ile AST'yi yazdırır. Depo kopyasında bin/test262 uygunluk test paketini çalıştırır.
Node.js Oracle'ı
Senaryolar Node.js (V8) ile karşılaştırılarak denetlenir. WPT ve kitaplık test paketi, motora dokunan gönderimlerde CI içinde çalışır; tam test262 çalıştırması isteğe bağlıdır ve en son 2026-06-09'da yapılmıştır.
Gerçek Kitaplıklar
Aralarında acorn, mustache.js, lodash ve marked'in de bulunduğu 204 npm paketi, Node ile bayt düzeyinde aynı çıktı ürettiği doğrulanarak test edilir.
Phasis neden tercih edilmeli
Node.js süreci yok
Phasis, PHP içinde doğrudan JavaScript kodunu ayrıştırır, sözdizimsel çözümlemesini yapar ve çalıştırır; Node'a exec() çağrısı yapmaz ve FFI kullanmaz. Composer paketi olarak yüklenir.
Ana makine denetiminde fetch
fetch() varsayılan olarak ext-curl kullanır. setFetchTransport(), örneğin testlerde bir taklit kullanmak için aktarım katmanını değiştirir; setFetchPolicy() ise her isteğin gönderilmeden önce reddedilmesine veya yeniden yazılmasına olanak tanır.
Sanal zamandaki zamanlayıcılar
eval() dönmeden önce olay döngüsünü boşaltır; saat uyumak yerine sıradaki bekleyen zamanlayıcıya atlar. Uzun süre çalışan ana makineler döngüyü gerçek zamanlı olarak tickEventLoop() ile çalıştırabilir.
Ayrıştırıcı ve biçimlendirici dâhil
Ayrıştırıcı, ESTree biçiminde dışa aktarılabilen türlenmiş bir PHP AST döndürür. Biçimlendirici, prettier ile uyumlu bir düzen kullanarak JavaScript, JSON ve CSS kodunu yeniden yazdırır.
Karşılaştırma
Bir PHP uygulamasından JavaScript çalıştırmanın veya işlemenin diğer yolları.
| Araç | Şu konularda başarılı | Phasis ile farkı |
|---|---|---|
| Node.js | Şu konularda başarılıNode.js, V8 motorunda JavaScript çalıştırır ve paketleri node_modules klasörlerinden çözümler; böylece npm bağımlılıkları adlarıyla yüklenir. | Phasis ile farkıPHP üzerinden Node'u çağırmak ikinci bir çalışma zamanı ve alt süreç sınırı ekler. Phasis, PHP içinde çalışır; ancak modül yükleyicisinde node_modules veya package.json dışa aktarımlarını çözümleme desteği yoktur. Bu nedenle npm paketleri önce, örneğin esbuild ile, paketlenmelidir. |
| V8Js | Şu konularda başarılıV8Js, PHP içinde Google'ın V8 motorunu içerir ve JavaScript'i, süre ve bellek sınırlarıyla kısıtlanabilen bir sanal alanda çalıştırır. | Phasis ile farkıV8Js, libv8 kitaplığını gerektiren derlenmiş bir eklentidir. Phasis, Composer kaynaklı düz PHP kodudur; belgelerine göre dağıtım ağırlıklı kodda çalışma zamanı, V8 ile karşılaştırıldığında yaklaşık 100 kat daha uzundur. |
| Peast | Şu konularda başarılıPeast, JavaScript kodunu PHP 5.4 ve sonraki sürümlerde ESTree AST'ye ayrıştırır; ağaçta dolaşma, seçici sorguları ve işleme özellikleri ekler. | Phasis ile farkıPhasis için PHP 8.2 gerekir. Ayrıştırıcısı türlenmiş, salt okunur düğüm nesneleri ve bir ESTree dışa aktarımı döndürür; aynı paket kodu da çalıştırabilir. |
| Prettier | Şu konularda başarılıJavaScript, Prettier, TypeScript, JSX, CSS, HTML, Markdown, YAML ve daha fazlasını biçimlendirir; npm üzerinden yüklenir. | Phasis ile farkıPhasis biçimlendiricisi yalnızca JavaScript, JSON ve CSS dillerini destekler. Seçenekleri prettier 3.x seçeneklerini temel alır ve PHP içinde çalışır; Node.js yoktur. |
Sorular ve yanıtlar
Phasis dokümantasyonundan kısa yanıtlar.
Composer için bcmath, curl ve mbstring ile PHP 8.2 veya sonrası gerekir. Intl API'leri ve ISO olmayan Temporal takvimleri için intl; crypto.subtle içinde AES şifrelemesi için openssl önerilir.
Phasis, bayt kodu VM'si bulunan bir ağaç dolaşımlı yorumlayıcıdır; JIT değildir. Belgelerine göre dağıtım ağırlıklı kodda çalışma zamanı, V8 ile karşılaştırıldığında yaklaşık 100 kat daha uzundur; gömme çalışmalarında, örneğin doğrulama kurallarında, bu üst sınırın nadiren önem taşıdığı belirtilir.
Adlarıyla içe aktarılamaz. Modül yükleyicisi içe aktarımları dosya sisteminde çözümler, açık dosya uzantıları gerektirir ve node_modules ya da package.json dışa aktarımlarını desteklemez. Bu nedenle bir paketi esbuild gibi bir araçla paketleyip paketi Phasis'e aktarın.
Yok. window, document ve DOM ağacı sunulmaz; process, Buffer ve require() gibi Node global değişkenleri de yoktur.
Çıktı yazdırılmak yerine motorda arabelleğe alınır. getConsoleOutput() veya getConsoleLines() ile okuyun; arabelleği clearConsole() ile boşaltın.
Yakalanmayan bir fırlatma Phasis\Exceptions\JsThrowable olarak görünür. Motorun kendisinin oluşturduğu, örneğin null değerinin özelliğini okumaya çalışırken oluşan hatalar Phasis\Exceptions\TypeError, ReferenceError veya RangeError olarak görünür ve bunların tümü Phasis\Exceptions\RuntimeError sınıfını genişletir. Geçersiz kaynak, satır, sütun ve ofset bilgileriyle bir Phasis\Exceptions\SyntaxError olan Phasis\Parser\ParseError hatasını fırlatır.
Başlangıç kılavuzuyla başlayın, ardından getirme kancaları ve olay döngüsü için API başvurusunu okuyun.