PHP 运行时性能基准
PHP 运行时团队中有一些相当新的成员。了解他们与那些知名且广泛使用的运行时相比有多优秀是很有趣的。
我想要得到答案的主要问题是:
- 运行时每秒可以处理多少个请求?
- 每个运行时可以提供的平均响应时间是多少?
为了公平竞争,所有运行时都分配相同的资源。几乎相同。如果运行时仅包含 1 个容器(例如 Nginx Unit),则使用 1 个 CPU 和 1GB RAM 运行。如果运行时包含 2 个容器(例如 Nginx + PHP-FPM),则每个容器使用 1 个 CPU 和 1GB RAM 运行。
测试环境
- 每个运行时在 1 或 2 个 Docker 容器中运行。
- 每个容器有 1 个 CPU 和 1GB RAM。
- 负载测试工具位于同一 Docker 网络中
测试应用程序。
让我们尝试一些比单文件 Hello-World 更复杂的东西。因此,我们有:
- Symfony 7
- 1个控制器
- 1 次查看
- 没有数据库或任何其他外部服务
Symfony 提供了运行时组件。根据官方文档,它“将引导逻辑与任何全局状态解耦,以确保应用程序能够使用类似的运行时运行”。这意味着,您可以使用任何您喜欢的运行时来开发应用程序,但在生产环境中以性能最佳的方式运行。因此,我们不仅可以使用传统的服务器运行应用程序,还可以使用 Swoole、AMPHP 和 ReactPHP 等库来运行应用程序。展望未来,后两者被排除在竞争之外。
负载测试工具
使用 K6 进行负载测试。每个运行时运行 3 次,并发连接数分别为 10、100 和 1000,测试时间均为 30 秒。
运行时
- Apache(prefork 模式)+ mod_php。
- Apache(事件模式)+ PHP-FPM
- Nginx + PHP-FPM
- Nginx Unit应用服务器。
- 走鹃
- Nginx + Roadrunner(fcgi模式)
- FrankenPHP
- FrankenPHP(工作模式)
- Swoole
所有运行时均基于官方 Docker 镜像。不使用卷,应用程序代码在构建过程中复制到镜像中。除 Nginx Unit 外,所有版本均支持 PHP 8.3。截至 2024 年初,Nginx Unit 支持的最高 PHP 版本为 8.2。
不幸的是,我没有找到与 Symfony 7 兼容的 ReactPHP 和 AMPHP 运行时的最新版本。PHPPM GitHub 和 Dockerhub 看起来都被放弃了。
应用以下 PHP 和 Symfony 设置:
- 使用 php.ini-production(官方 Docker 容器附带)
- 已启用 Opcache
- 已启用 JIT
- 根据 Symfony 最佳实践配置 preload
- Composer 自动加载器已优化
- Symfony 以生产模式运行
- 服务容器被转储到单个文件中
- Symfony 缓存在容器构建期间预热
应用程序代码以及容器配置可以在GitHub上找到。
结果
- 001_Apache+mod_php 和 002_Apache + PHP-FPM 显示的结果几乎相同。
- 003_Nginx+PHP-FPM 在工作负载较低(并发数 10 和 100)时,性能表现与 001_Apache+mod_php 和 002_Apache + PHP-FPM 非常接近。
- 003_当并发量为 1000 时,Nginx+PHP-FPM 能够比基于 Apache 的堆栈多处理约 2 倍的请求
- 004_Nginx 单元。首先 — 哇哦!!!它比传统且最流行的 003_Nginx+PHP-FPM 快了约 3 倍。
- 我认为 005_Roadrunner 和 006_Nginx+Roadrunner 之间没有太大区别。
- 尽管如此,基于 Roadrunner 的堆栈比 003_Nginx+PHP-FPM 快约 2 倍。
- 007_FrankenPHP(非工作模式)从性能角度来看与 003_Nginx+PHP-FPM 非常接近
- 008_FrankenPHP(工作模式)。哇哦!第一次尝试时我简直不敢相信,然后又跑了三四次负载测试。结果显示,在发送 1000 个并发请求时,FrankenPHP(工作模式)比 Nginx+PHP-FPM 快 10 倍以上。此外,还遇到了一个问题:无法使用 php-ini.production 启动容器。
- 009_swoole — 同样令人惊叹!速度几乎与 008_FrankenPHP(wm) 相同,速度极快。但请记住,您的代码需要进行调整才能使用 Swoole 运行。对于 Symfony,我们有一个扩展了 symfony/runtime 组件的软件包。
个人意见。
- FrankenPHP — 令人惊叹的工作,第一个成为 PHP 世界事实上的标准候选者。
- Swoole — 我希望它成为开箱即用的(但已禁用)PHP 扩展。
- Nginx Unit — 我个人的选择。尽管它不支持 HTTP2 以及 Nginx 提供的许多其他传统功能,但它配置起来超级简单、轻量且快速。
下一步是什么?
值得尝试使用连接到数据库的应用程序进行相同的测试。
尝试基于 ReactPHP、AMPHP 和 PHPPM 的运行时。但在此之前,需要更新相应的软件包才能与 Symfony 7 兼容。
运行具有更多资源的容器,比如 2-4 个 CPU 和 4-8GB RAM。看看运行时的扩展能力如何,这将会很有趣。
文章来源:https://dev.to/dimdev/performance-benchmark-of-php-runtimes-2lmc