İçeriğe geç

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.

Terminal
composer require phasis/phasis

En son sürüm v0.4.2 MIT PHP 8.2+, ext-bcmath, ext-curl, ext-mbstring

Uygulamada

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.

Motor
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"

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ı.

Phasis ile diğer araçların karşılaştırması
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.

Başlangıç kılavuzuyla başlayın, ardından getirme kancaları ve olay döngüsü için API başvurusunu okuyun.