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 提供了另一条路径:
- 标量类型
int、float、bool直接映射为 C++int64_t、double、bool,高强度数值运算提速明显。 - 支持
BigInt、Decimal、BigFloat等精度类型,并提供类型化运算符和方法 API。 - 提供
std::array、std::vector、std::map、std::unordered_map等强类型容器,需要时可替代普通 PHP 数组。 - 编译产物无法反编译回源码,适合商业分发场景。
- 同一套代码可编译为
bin(独立可执行文件)、ext(PHP 扩展)、lib(共享库),一份代码库覆盖多种部署需要。
一个具体示例
假设需要更新数组中的数百万个元素,比如大型库存系统批量重算商品价格,或为每日报表聚合数据。
普通 PHP 数组中每次元素访问都经过动态访问机制,开销较大。TypePHP 团队的基准测试显示,使用 std::array 大规模更新元素的速度约为普通 PHP 数组的 10 倍。
编译流程如下:
- 解析并验证 PHP 代码,必要时由
.stub.php文件补充类型声明。 - 收集代码中所有声明。
- 将函数体和常量「降级转换」为 C++17。
- 原生编译器将 C++17 转换为二进制,复用目标文件和预编译头(PCH)缓存。
- 最终输出可执行文件、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 很慢」的说法正在变得过时。
