导读:PHP 8.5 会让你惊喜,不论是实际速度、异步和 API开发。
我曾多次更换技术栈,出于好奇做过各种基准测试,也曾为了节省 20 毫秒而搞垮生产服务器。最近网上都在争论:PHP 的速度能和 Node 相媲美吗?随着 PHP 8.5 的发布,我想抛开营销噱头,解释一下真正影响异步任务和 API 速度的因素。
首先要说明的是:
PHP 8.5 在运行时和 JIT 方面带来了一些改进,但异步/API 吞吐量的最大提升来自于架构和运行时选择(Swoole/RoadRunner/Octane、连接处理以及 I/O 操作方式),而不是 PHP 的版本号。(数据来源:php.watch;Tideways 和 Kinsta 基准测试结果)。
PHP 8.3 取得了显著的进步(JIT 成熟度、优化),许多框架也已经获得了大幅提升。
PHP8.5 专注于提升开发者的工作体验和一些运行时优化;它并非彻底重写,而是包含 JIT 和一些内部调整,可以略微改善 CPU 密集型工作负载的性能。实际应用中可能会看到一些小幅的改进,但默认情况下不会有两倍的速度提升。
Node.js 的核心运行时内置了事件循环和非阻塞 I/O。对于纯粹的 I/O 密集型工作负载(例如大量小型并发请求、WebSocket、流式传输),Node 通常更容易实现高并发和低单连接内存占用。(Techempower)
PHP 过去采用的是每个进程一个请求的模式。如今,PHP 可以在支持异步的长时间运行运行时环境中运行(例如 Swoole、RoadRunner、ReactPHP 和 Laravel Octane)。在这些运行时环境中运行 PHP 时,由于避免了冷启动,并且可以使用异步 I/O 和协程,因此它在异步任务方面更具竞争力。
实际的比较取决于具体的实现方式。
实际情况:如果使用标准的 PHP-FPM + Apache/Nginx,Node 在高并发 I/O 方面通常会胜出。如果使用 Swoole 或 RoadRunner 并优化代码,PHP 在许多 API 工作负载上可以与 Node 匹敌甚至超越,尤其是在 PHP 的 JIT 加速 CPU 密集型部分的情况下。(基准测试结果各不相同;许多社区测试的结果也存在一定差异)
实际测试涵盖整个技术栈:网络、序列化、数据库、库等等。微基准测试(例如 Hello World 或 JSON echo)虽然能显示原始吞吐量,但可能会产生误导。Techempower 框架测试是进行框架级比较的更佳基准。
独立测试结果,显示如下:
对于主要代理数据库调用的 API:使用连接池和 async/await 的 Node.js 结点,每个核心可能处理更多的并发任务。如果运行 PHP-FPM,则会生成更多进程并占用更多内存。如果使用 RoadRunner/Swoole 运行 PHP,则差距会变小。
请求中占用大量 CPU 资源的图像处理:PHP 8.3+ 的 JIT 改进和 8.5 的优化后,可以使 PHP 在处理 CPU 密集型部分时比 Node 更快。尽可能将繁重的工作卸载到后台任务,两种运行时环境都能够从中受益。
选择合适的运行时:对于 PHP,如果需要持久工作进程和低延迟,请各位优先选择 Swoole、RoadRunner 或 Octane。
对实际工作负载进行基准测试,而不是使用简单的示例程序。使用真实的负载、数据库和相同的部署拓扑结构。Techempower 或单请求微基准测试只是起点。
监控内存和 CPU 使用情况:Node.js 可以针对每个连接高效利用内存;PHP 工作进程模型为了简化操作而牺牲内存使用,除非你使用长时间运行的工作进程。
性能分析:使用 Tideways、Xdebug 或 Node.js 分析器查找性能瓶颈;优化序列化或数据库访问通常比升级运行时环境更有效。
升级到 PHP 8.5 在安全性、性能小幅提升和新语言的易用性方面都是明智之举——但不要指望一次版本升级就能彻底解决 API 延迟问题。
对于异步操作较多的系统,架构(事件循环与工作进程、长时间运行的进程、非阻塞驱动程序)比版本号的细微变化更为重要。
Node 在原生非阻塞 I/O 的易用性方面保持优势;而 PHP 在采用 Swoole/Octane 并优化技术栈后,正在缩小与 Node 的性能差距。
作者:场长
本篇文章为 @ 场长 创作并授权 21CTO 发布,未经许可,请勿转载。
内容授权事宜请您联系 webmaster@21cto.com或关注 21CTO 公众号。
该文观点仅代表作者本人,21CTO 平台仅提供信息存储空间服务。
请扫描二维码,使用微信支付哦。