简介
Phasis 是纯 PHP JavaScript 引擎。它在宿主 PHP 进程中对 ECMAScript 进行词法分析、解析和执行,无需 exec('node …')、FFI 或自定义二进制扩展。它需要三个标准 PHP 扩展:ext-mbstring、ext-bcmath 和 ext-curl(默认 fetch() 传输机制)。ext-intl 和 ext-openssl 是可选的。若构建版本未包含 bcmath,请参阅入门指南。
- 可嵌入 — 通过
Phasis\Engine类,将 JS 运行时嵌入任何 PHP 应用、框架或 CLI 工具。 - 符合规范 — 通过官方 test262 测试套件,覆盖率达 100%,涵盖每个类别且没有跳过。
- Web API — 完整的 Web Platform Pack(URL、TextEncoder/Decoder、atob/btoa、structuredClone、performance、DOMException)、完整的 Fetch Pack(fetch、Request、Response、Headers、Body、AbortController/Signal、Blob、File、FormData、EventTarget、完整 WHATWG Streams、navigator),以及
crypto+SubtleCrypto、WebSocket、XMLHttpRequest和真正的事件循环。导入的 Web Platform Tests 通过率为 100%。 - 现代功能 — 箭头函数、类、async/await、Promises、生成器、Symbol、BigInt、Proxy、Reflect、Temporal、Intl、TypedArrays 和完整模块支持。
- PHP↔JS 互操作 — 将 PHP 标量和数组传入 JS(数组会被复制),将 PHP 闭包绑定为 JS 函数,并从 PHP 调用 JS 函数。PHP 对象目前还不能与 JS 共享;请参阅共享对象。
Phasis 的由来
需要运行用户提供的 JavaScript 的 PHP 应用——例如模板引擎、前端 SSR 兼容层、数据验证规则、内容沙箱和无头测试运行器——通常会调用 Node.js,或者放弃这项功能。无论哪种方式都会增加运维复杂度:多一个运行时、一个序列化边界、一系列子进程管道,以及在共享主机环境中难以安全部署的问题。
Phasis 弥补了这一缺口。你的 PHP 代码仅使用 PHP 8.2+、mbstring、bcmath 和 curl,就能对 JavaScript 进行词法分析、解析和执行。引擎以 Composer 包的形式发布,并提供小巧精简的 API 接口。
功能说明
- 实现完整的 ECMAScript 标准库:
Array、String、Object、Math、JSON、Date、RegExp、Map、Set、Promise、Proxy、Reflect、Symbol、BigInt、TypedArray、Temporal、Intl、生成器、异步迭代器和模块。 - 提供真实 JS 库会预先检查的 Web Platform API:
URL、URLSearchParams、TextEncoder/TextDecoder、atob/btoa、structuredClone、performance、DOMException。完整接口请参阅Web API。 - 提供
fetch和完整的 Fetch 系列——Request、Response、Headers、正文读取方法、AbortController/AbortSignal、Blob、File、FormData、EventTarget/Event,以及完整的 WHATWG Streams(ReadableStream、WritableStream、TransformStream、BYOB、排队策略)。通过 PHP 的ext-curl,真正的 HTTP 开箱即用。 - 提供
crypto+ 完整的SubtleCrypto(SHA 系列、HMAC、AES-GCM/CBC/CTR、RSA-OAEP/PSS/PKCS1、ECDSA、ECDH、HKDF、PBKDF2)、WebSocket(RFC 6455 + 可替换传输机制)以及XMLHttpRequest(基于同一 Fetch 传输机制构建)。 - 提供真正的 事件循环:
setTimeout、setInterval、clearTimeout、clearInterval、queueMicrotask,以及 Stage-3AsyncContext,用于在异步边界之间传递值。 - 支持现代语法——解构、展开/剩余参数、计算属性、可选链、空值合并、模板字面量、标记模板、类(包括私有字段、静态代码块和装饰器)以及顶层 await。
- 支持跨越 PHP↔JS 边界转换值。标量和数组会被复制传入,PHP 可调用对象会转换为 JS 函数,JS 的结果会以 PHP 标量和数组的形式返回。具体规则请参阅值转换。
- 由宿主控制运行。宿主管理
fetch传输机制和策略钩子,事件循环使用虚拟时间运行,固定的调用栈上限可阻止无限递归。虽然提供了循环迭代次数限制,但目前尚未对字节码 VM 运行的循环强制执行;此外也没有字符串长度、输出或墙钟时间限制,详见 API:setLimit。 - 使用 Node.js(V8)验证。每次推送到
main以及每个拉取请求都会触发 CI 运行单元测试和预言机测试套件;引擎源码变更时,还会运行 Web Platform Tests 和热门软件包测试套件。完整的 test262 矩阵需手动运行,并将其快照提交到COMPAT.md。请参阅兼容性。
它不是什么
Phasis 不是 JIT 编译器,而是树遍历解释器,并配有按需运行的字节码 VM。在受分派开销限制的工作负载中,其运行时间约为 100× V8。这一取舍带来零依赖、纯 PHP 和由宿主控制的执行,非常适合将 JavaScript 嵌入 PHP 应用,在这些应用中,正确性和隔离比原始吞吐量更重要。