TypePHP:让 PHP 快150倍

我们都习惯了听到PHP"对大多数用例来说足够快",但与Go、Rust或C++等编译语言相比,很少有人会说PHP很快。这个说法刚刚变得有点站不住脚。Swoole背后的团队最近开源了TypePHP,一个将您每天编写的PHP代码转换为本机二进制文件的编译器,而不是像往常一样通过解释器运行。

在您急于将其与JavaScript世界中的TypeScript进行比较之前,让我们先澄清一些事情:两个项目都源于类似的挫败感,但它们以非常不同的方式解决它。TypeScript为JavaScript添加类型安全性,使您的代码编写更安全,然后被转换回普通JavaScript。TypePHP更进一步——它实际上将您的PHP代码编译成CPU直接运行的本机机器指令,没有将其转换回PHP的步骤。

1、那么,TypePHP到底是什么?

简而言之,TypePHP是一个预编译(AOT)编译器,将PHP源代码转换为C++,然后再次编译为本机机器代码。这与PHP当前的运行方式根本不同,后者通过Zend解释器并在运行时执行操作码。

一个简单的并排比较:

  • 普通PHP:编写代码 → 编译成操作码 → Zend引擎在运行时逐个读取操作码
  • TypePHP:编写代码(仍然使用您已经知道的PHP语法) → 编译成C++17 → 再次编译成本机二进制文件 → 直接在CPU上运行,没有剩余的操作码读取步骤

有趣的是,TypePHP保留了我们都习惯的PHP语法,同时添加了编译时类型信息。这让编译器可以为代码中执行繁重计算的部分发出静态类型化的、优化的C++。

您可能想知道PHP的动态特性会发生什么,比如我们经常依赖的反射或内部函数。动态值、内部函数、反射和对象元数据仍然通过称为PHPX的层与Zend运行时互操作。因此TypePHP并没有完全抛弃PHP的动态特性——只是一旦函数被编译,它就不再作为Zend操作码执行。

一个值得注意的细节:TypePHP完全用PHP编写,完全自托管。tpc编译器二进制文件是通过使用TypePHP本身编译编译器的源代码构建的。编译器内部没有C或C++胶水代码。

2、为什么这不仅仅是"PHP版本的TypeScript"

本文的标题依赖于TypeScript比较,因为这是一个简单的心理捷径,但值得提前说明差异,以便正确设置您的期望:

  • TypeScript是JavaScript的超集,在转换回普通JavaScript后仍然在相同的JS引擎(V8和类似引擎)上运行
  • TypePHP不仅仅在PHP之上添加类型注解——它将您的代码编译成本机二进制文件,而不是转换回.php文件
  • TypeScript主要是在开发期间的类型安全性;TypePHP主要是在生产中的运行时性能
  • TypePHP的输出可以是独立可执行文件、PHP扩展或共享库——不仅仅是转换的源文件

因此,更准确的类比是:TypeScript是帮助您编写更安全JS代码的"护栏",而TypePHP是将您的PHP代码转换为CPU直接理解的内容的"翻译器"。

3、为什么PHP开发者应该关心

每当我们过去需要极高性能时,通常的答案是用另一种语言重写热路径——Go、Rust或手写C扩展。TypePHP提供了一个值得中间地带:

  • 标量类型(int、float、bool)直接映射到本机C++类型(int64_tdoublebool),这显著加快了繁重的数值运算
  • 它支持高精度类型,如BigInt、Decimal和BigFloat,以及它们自己的类型化运算符和方法API
  • 它提供强类型容器,如std::arraystd::vectorstd::mapstd::unordered_map,当您真正需要时,提供比普通PHP数组更高效的数据结构
  • 编译的二进制文件无法反编译回源代码,如果您需要分发商业软件而不暴露源代码,这是一个真正的优势
  • 相同的代码库可以编译成三种不同的输出:独立可执行文件(bin)、PHP扩展(ext)或共享库(lib)——因此一个代码库可以满足多个部署需求

4、为什么这感觉不同的简单说明

想象一个更新数组中数百万个元素的过程——例如,在大型库存系统中重新计算产品价格,或聚合每日报告的数据。

使用普通PHP数组,每个元素访问都通过PHP的动态访问机制,这有其自身的开销。TypePHP团队记录的一个基准测试比较了使用普通PHP数组与TypePHP的std::array大规模更新元素,在这种情况下,std::array比普通PHP数组快大约10倍。

一般的编译流程大致如下:

  • 您的PHP代码(以及来自.stub.php文件的类型声明,需要时)被解析和验证
  • 编译器收集代码中找到的所有声明
  • 函数体和常量被"降低"为C++17
  • 本机编译器将C++17代码转换为二进制文件,沿途重用对象和PCH缓存
  • 最终输出是可执行文件、PHP扩展、共享库,甚至是WASI组件

对于充满重复数值操作的代码——报告计算、批处理数据处理或大型数组操作——性能提升往往比主要是数据库查询或API调用的代码更显著,因为在第二种情况下,瓶颈通常首先不是PHP的CPU工作。

5、尝试之前需要知道什么

在您急于将其投入生产项目之前,有几件事值得记住:

  • TypePHP仍在积极开发中,有意支持经过定义和测试的PHP子集,而不是声称与所有动态PHP程序完全兼容
  • 在现有应用程序中采用它之前,值得阅读兼容性模型和不支持的功能列表
  • PHP版本要求相当具体:PHP 8.4到但不包括8.6
  • 该项目在GNU通用公共许可证v3.0下发布——开源且免费使用,但如果您计划在商业产品中使用它,仍应检查许可条款
  • 实际发布比计划提前了。Swoole团队最初目标是在2026年10月左右发布beta版本,但该项目提前开源了

6、最后的想法

我们不需要急于在本周将每个项目迁移到TypePHP。但如果您使用的是承载繁重计算负载的PHP代码——大规模数据处理、密集数值计算,或代码库中历史上一直是性能瓶颈的部分——这是一个值得密切关注的项目。

有一件事是清楚的:"PHP很慢"的旧叙事变得越来越难以辩解。首先我们有了OPcache,然后是JIT编译器,现在通过TypePHP有了本机编译路径。PHP的发展轨迹指向性能将被更加认真对待。


原文链接:Getting to Know TypePHP, the New Compiler That Makes PHP Run Faster

汇智网翻译整理,转载请标明出处