编程 TypePHP:Swoole 团队开源的 AOT 编译器,把 PHP 代码编译为原生二进制

2026-09-05 08:18:17

Swoole 团队近期开源了 TypePHP:一个能把 PHP 代码编译为原生二进制文件的 AOT 编译器。与常规的 Zend 解释器逐条执行操作码不同,TypePHP 将 PHP 源代码先转换为 C++17 代码,再通过原生编译器编译为机器码。

这一思路容易让人联想到 JavaScript 生态中的 TypeScript,但两者解决问题的层次不同。TypeScript 为 JavaScript 增加类型安全后,仍会转译回普通 JavaScript 运行在原有引擎上。TypePHP 则直接绕开 Zend 运行时,最终产出 CPU 可直接执行的二进制文件。

项目信息

  • 仓库:https://github.com/swoole/typephp
  • 官网 / 文档:https://swoole.com/aot/
  • 安装文档:https://swoole.com/aot/en/docs/install
  • Composer 安装:composer require --dev swoole/typephp
  • 从源码编译:
git clone https://github.com/swoole/typephp.git
cd typephp
composer install
php bin/tpc.php --help

TypePHP 是什么

TypePHP 是 PHP 代码的预先编译(Ahead-Of-Time,AOT)编译器,执行链如下:

  • 普通 PHP:编写代码 → 编译为操作码 → Zend Engine 在运行时逐条读取并执行操作码。
  • TypePHP:使用 PHP 语法编写代码 → 编译为 C++17 → 编译为原生二进制文件 → 直接在 CPU 上执行。

TypePHP 保留熟悉的 PHP 语法,同时引入编译期类型信息,使编译器能为计算密集代码生成静态类型且经过优化的 C++ 代码。

动态特性并非被彻底抛弃。反射、内部函数、动态值和对象元数据仍可通过 PHPX 中间层与 Zend 运行时互操作,但已编译的函数不再以 Zend 操作码形式执行。

另一个值得注意的细节是:TypePHP 完全用 PHP 编写并实现了自举。tpc 编译器二进制由 TypePHP 编译自身源代码生成,内部没有 C/C++ 胶水层。

与 TypeScript 的差异

用 TypeScript 作类比便于理解,但两者差异需要明确:

  • TypeScript 是 JavaScript 的超集,转译后仍运行在 V8 等 JavaScript 引擎上。
  • TypePHP 并非只加类型注解,而是编译为原生二进制,不重新生成 .php 文件。
  • TypeScript 解决开发阶段的类型安全,TypePHP 面向生产环境的运行时性能。
  • TypePHP 输出可以是独立可执行文件、PHP 扩展或共享库。

更准确的比喻是:TypeScript 是一道护栏,帮开发者写更安全的 JS;TypePHP 是一名翻译器,把 PHP 代码翻译成 CPU 能理解的形式。

对 PHP 开发者的价值

过去优化性能瓶颈的常规手段是用 Go、Rust 重写热点路径,或手写 C 扩展。TypePHP 提供了另一条路径:

  • 标量类型 intfloatbool 直接映射为 C++ int64_tdoublebool,高强度数值运算提速明显。
  • 支持 BigIntDecimalBigFloat 等精度类型,并提供类型化运算符和方法 API。
  • 提供 std::arraystd::vectorstd::mapstd::unordered_map 等强类型容器,需要时可替代普通 PHP 数组。
  • 编译产物无法反编译回源码,适合商业分发场景。
  • 同一套代码可编译为 bin(独立可执行文件)、ext(PHP 扩展)、lib(共享库),一份代码库覆盖多种部署需要。

一个具体示例

假设需要更新数组中的数百万个元素,比如大型库存系统批量重算商品价格,或为每日报表聚合数据。

普通 PHP 数组中每次元素访问都经过动态访问机制,开销较大。TypePHP 团队的基准测试显示,使用 std::array 大规模更新元素的速度约为普通 PHP 数组的 10 倍。

编译流程如下:

  1. 解析并验证 PHP 代码,必要时由 .stub.php 文件补充类型声明。
  2. 收集代码中所有声明。
  3. 将函数体和常量「降级转换」为 C++17。
  4. 原生编译器将 C++17 转换为二进制,复用目标文件和预编译头(PCH)缓存。
  5. 最终输出可执行文件、PHP 扩展、共享库,或 WASI 组件。

需要说明的是,性能提升主要体现在重复数值运算场景,如报表计算、批量数据处理和大型数组操作。数据库查询或 API 调用为主的代码提升不明显,瓶颈通常不在 PHP 的 CPU 计算上。

引入前的注意事项

TypePHP 仍处于积极开发阶段,以下几点需要留意:

  • 有意支持经过定义和测试的 PHP 子集,不宣称兼容所有高度动态的 PHP 程序。
  • 引入前建议先阅读兼容性模型和不受支持的功能列表。
  • 支持 PHP 8.4 及以上版本,不含 PHP 8.6。
  • 采用 GPL v3.0 许可证,开源免费。用于商业产品前需检查许可证条款。
  • 项目比计划提前开源。Swoole 团队原计划约 2026 年 10 月发布 Beta,后来决定提前。

结语

不必这周就把项目全部迁移到 TypePHP。但如果代码中存在沉重计算负载——大规模数据处理、密集型数值计算,或是长期性能瓶颈——这个项目值得持续关注。

PHP 性能路径上的变化是明确的:先是 OPcache,随后引入 JIT,如今有了 TypePHP 的原生编译路径。「PHP 很慢」的说法正在变得过时。

复制全文 生成海报 PHP 编译器 性能优化 开源

推荐文章

程序员茄子在线接单