尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

PHP 8.5 垃圾回收改进

PHP 8.5 垃圾回收改进
📅 发布时间:2026/6/18 18:37:32

PHP 8.5 垃圾回收改进

PHP 内存消耗的大幅优化已经很罕见了。近年来的内存改进范围较小,主要集中在某些类型变量的细节上。

比如改进垃圾回收器(GC)在边缘情况下的表现。Iljia Tovilo 为 PHP 8.5 贡献了这个优化,标题是“将枚举和静态伪闭包标记为不可回收”。

简单来说,对于这两种变量类型,循环回收器不会尝试“收集”它们,大量使用这些实例时就能避免不必要的 GC 运行。

这没有任何副作用,因为这些类型本身不可能形成循环引用,本来就不在 GC 的管辖范围内。

原文链接 PHP 8.5 垃圾回收改进

快速回顾:PHP 的垃圾回收器是如何工作的?

要理解为什么这很有用,先快速回顾一下 PHP 垃圾回收的工作原理。

简单来说,PHP 的 GC 不是持续运行的,而是由阈值触发。这个阈值是:内存中至少有 10,000 个可能存在循环引用的对象或数组。如果这些实例数量不断增加而无法清理,GC 可能会在越来越多的对象上运行,消耗宝贵的计算资源。

因此,减少符合垃圾回收条件的对象数量可以降低 GC 运行的概率,从而提升性能。

PHP 7.3 添加了一个实用函数 gc_status()(文档),可以很方便地了解垃圾回收的性能情况。

实际收益是什么?

看一下 PR 中的例子,大量 first class callable 实例被添加到数组中,然后进行迭代。

<?phpfunction foo() {}$array = [];
for ($i = 0; $i < 10_000_000; $i++) {$array[] = foo(...);
}//
// 这个循环是为了确保触发循环回收器:
// - `as $foo` 会增加数组元素的引用计数
// - 变量超出作用域后引用计数又会减少
//
foreach ($array as $foo) {}echo json_encode(gc_status(), JSON_PRETTY_PRINT);

在旧版 PHP 中,这会触发循环回收器检查所有这些实例是否存在循环引用。由于这些实例不可能有循环引用,这些检查是多余的。对于 1000 万个条目,这导致了 44 次 GC 运行,而 PHP 8.5 及以后版本在相同代码下是 0 次。

定义:"静态伪闭包"

PR 标题说优化适用于“枚举和静态伪闭包”。静态伪闭包显然是更常见的情况,而且术语与用户层面的命名不一致,我们来深入了解一下:什么是“静态伪闭包”?

上面的例子使用了"静态伪闭包",在用户层面通常称为"first-class callable"。在这个例子中,就是 foo(...)。

要判断一个 callable 是否是"伪闭包",可以检查该 callable 的反射类的 anonymous 标志是否返回 false,即 (new \ReflectionFunction($callable))->isAnonymous();。

类型中的“静态”部分指的是 OOP 中的 static:没有访问对象实例(即 $this)的权限。

在下面这个不同闭包的列表中,你可以看到哪些被 PR 认为是静态伪闭包,哪些不是:

<?phpclass Foo 
{public static function bar(): void {}public function baz(): void {}    
}function bar(): void {}//
// 静态伪闭包
//
var_dump(...);
bar(...);
Foo::bar(...);
$callable = Closure::fromCallable('bar');
$callable(...);// 伪闭包,但非静态
(new Foo())->baz(...);
// 匿名函数,不是伪闭包
$anon = static function () {};
$anon(...);

枚举的情况

第二种被优化的类型是枚举实例。这在实际项目中的影响可能较小,因为只有当代码库包含大量枚举且每个枚举有很多 case 时才会影响性能。枚举实例是单例的,每个枚举 case 只会被实例化一次。即使有数千个引用指向相同的三四个枚举 case,也不会有影响,因为每个枚举 case 在 GC 的根缓冲区中只能出现一次。

总结

这样的小改进表明,PHP 的内存管理在已经相当成熟的情况下仍然可以继续优化。

这个改动可能在某些情况下提升性能,但更重要的是,它确保垃圾回收运行不会在无关的检查上浪费时间。

感谢 Iljia Tovilo 的贡献。

相关新闻

  • 架构革命:FlatBuffers与gRPC如何重塑微服务通信新范式
  • 显存减半速度翻倍:LightVAE如何优化AI视频生成效率?
  • Fast-Android-Networking网络拦截器:快速构建高效网络层的终极指南

最新新闻

  • 从CVE-2026-24763看沙箱逃逸:环境变量注入如何攻破AI智能体安全防线
  • 【人员】人员批量处理与外部数据导入
  • 5分钟快速上手OpenVSP:NASA开源飞机设计软件的完整教程
  • 从人脸识别到AR面具:技术实现与创意应用全解析
  • MPC801外部信号全景解析:从引脚到系统交互
  • 2026 年 6 月上海婚姻律师榜 专业靠谱婚家纠纷处理律师执业全梳理 - 外贸老黄

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号