Lewati ke konten

Pendahuluan

Phasis adalah mesin PHP JavaScript murni. Mesin ini melakukan leksing, parsing, dan eksekusi ECMAScript dalam proses host PHP — tanpa exec('node …'), tanpa FFI, dan tanpa ekstensi biner khusus. Mesin ini memerlukan tiga ekstensi PHP standar: ext-mbstring, ext-bcmath, dan ext-curl (transportasi fetch() bawaan). ext-intl dan ext-openssl bersifat opsional. Lihat Panduan Memulai untuk build yang tidak menyertakan bcmath.

  • Dapat disematkan — masukkan runtime JS ke aplikasi PHP, framework, atau alat CLI apa pun melalui kelas Phasis\Engine.
  • Mematuhi spesifikasi — lulus suite test262 resmi dengan nilai 100 %, di setiap kategori, tanpa ada yang dilewati.
  • API Web — Web Platform Pack lengkap (URL, TextEncoder/Decoder, atob/btoa, structuredClone, performance, DOMException), Fetch Pack lengkap (fetch, Request, Response, Headers, Body, AbortController/Signal, Blob, File, FormData, EventTarget, WHATWG Streams lengkap, navigator), serta crypto + SubtleCrypto, WebSocket, XMLHttpRequest, dan event loop sungguhan. 100 % Web Platform Tests yang diimpor lulus.
  • Fitur modern — fungsi panah, kelas, async/await, Promises, generator, Symbol, BigInt, Proxy, Reflect, Temporal, Intl, TypedArrays, dukungan modul lengkap.
  • Interoperabilitas PHP↔JS — kirim skalar dan array PHP ke JS (array disalin), ikat closure PHP sebagai fungsi JS, dan panggil fungsi JS dari PHP. Objek PHP belum dapat digunakan bersama JS; lihat Objek bersama.

Alasan keberadaan Phasis

Aplikasi PHP yang perlu menjalankan JavaScript dari pengguna — mesin templat, shim SSR frontend, aturan validasi data, sandbox konten, runner pengujian headless — biasanya menjalankan Node.js sebagai proses eksternal atau melewatkan fitur tersebut. Kedua pilihan itu menambah kompleksitas operasional: runtime kedua, batas serialisasi, jaringan pipe antarproses, dan masalah deployment yang berisiko di shared hosting.

Phasis mengatasi kesenjangan itu. Kode PHP Anda dapat melakukan leksing, parsing, dan eksekusi JavaScript hanya dengan PHP 8.2+ bersama mbstring, bcmath, dan curl. Mesin ini tersedia sebagai paket Composer dan menyediakan satu antarmuka API kecil.

Fungsinya

  • Mengimplementasikan pustaka standar ECMAScript secara lengkap: Array, String, Object, Math, JSON, Date, RegExp, Map, Set, Promise, Proxy, Reflect, Symbol, BigInt, TypedArray, Temporal, Intl, generator, iterator async, modul.
  • Menyediakan API Web Platform yang diperiksa keberadaannya terlebih dahulu oleh pustaka JS dunia nyata: URL, URLSearchParams, TextEncoder/TextDecoder, atob/btoa, structuredClone, performance, DOMException. Lihat API Web untuk daftar lengkap.
  • Menyediakan fetch dengan keluarga Fetch lengkap — Request, Response, Headers, pembaca body, AbortController/AbortSignal, Blob, File, FormData, EventTarget/Event, dan WHATWG Streams lengkap (ReadableStream, WritableStream, TransformStream, BYOB, strategi antrean). HTTP sungguhan langsung berfungsi melalui PHP ext-curl.
  • Menyediakan crypto + SubtleCrypto lengkap (keluarga SHA, HMAC, AES-GCM/CBC/CTR, RSA-OAEP/PSS/PKCS1, ECDSA, ECDH, HKDF, PBKDF2), WebSocket (RFC 6455 + transportasi yang dapat diganti), dan XMLHttpRequest (dibangun di atas transportasi fetch yang sama).
  • Menyediakan event loop sungguhan: setTimeout, setInterval, clearTimeout, clearInterval, queueMicrotask, serta AsyncContext Stage-3 untuk meneruskan nilai melintasi batas async.
  • Mendukung sintaks modern — destrukturisasi, spread/rest, properti komputasi, optional chaining, nullish coalescing, literal templat, templat bertag, kelas (dengan field privat, blok statis, dekorator), top-level await.
  • Mengonversi nilai melintasi batas PHP↔JS. Skalar dan array disalin saat masuk, callable PHP menjadi fungsi JS, dan hasil JS dikembalikan sebagai skalar dan array PHP. Lihat Konversi nilai untuk aturan lengkapnya.
  • Berjalan di bawah kendali host. Host memiliki transportasi fetch dan hook kebijakan, event loop berjalan dalam waktu virtual, dan batas tetap kedalaman tumpukan panggilan menghentikan rekursi tak terkendali. Batas iterasi loop tersedia, tetapi belum diberlakukan pada loop yang dijalankan VM bytecode; tidak ada batas panjang string, output, atau waktu nyata. Lihat API: setLimit.
  • Diverifikasi terhadap Node.js (V8). CI menjalankan suite unit dan oracle pada setiap push ke main dan setiap pull request, serta Web Platform Tests dan suite paket populer saat kode sumber mesin berubah; seluruh matriks test262 dijalankan secara manual dan snapshot-nya di-commit ke COMPAT.md. Lihat Kompatibilitas.

Hal yang bukan termasuk

Phasis bukan compiler JIT. Ini adalah interpreter yang menelusuri pohon dengan VM bytecode oportunistik. Pada beban kerja yang dibatasi oleh dispatch, perkirakan runtime sekitar 100× dibandingkan V8. Imbalannya adalah tanpa dependensi, PHP murni, dan eksekusi yang dikendalikan host — ideal untuk menyematkan JavaScript ke aplikasi PHP saat kebenaran dan isolasi lebih penting daripada throughput mentah.

Mulai di sini

  • Panduan Memulai — instal dan jalankan skrip pertama Anda.
  • CLI — bin/phasis untuk menjalankan file, mengevaluasi source, dan menampilkan AST.
  • API — sematkan Phasis\Engine di aplikasi PHP Anda.
  • Interoperabilitas — kirim nilai dan callable PHP ke JavaScript.
  • Kompatibilitas — cakupan test262 dan fitur yang didukung.
  • Parser — parse JavaScript menjadi AST bertipe atau ESTree tanpa mengeksekusinya.
  • Pemformat — format JavaScript, JSON, dan CSS dengan tata letak yang kompatibel dengan prettier.
  • Lanjutan — arsitektur, VM bytecode, benchmark, dan model pengujian oracle.