垃圾收集器(GC)是 PHP 中的内部内存管理系统,但有一些微妙之处需要理解。
?为什么 GC 会存在?
GC 自动化内存管理,消除了通过手动任务处理内存的麻烦(这会很乏味)。
这使得开发人员可以专注于他们的业务逻辑,而不必过度担心“内存不足”错误。
当然,这不是魔法。
?简而言之 10,000 个对象
释放不再需要的对象可以防止内存泄漏。
GC 使用计数机制来确定要丢弃的元素。如果没有引用指向特定对象(即 $counter = 0),则该对象有资格进行清理。
它工作得很好,但一些引用可能有问题:
class A { public $b; } class B { public $a; } $a = new A(); $b = new B(); $a->b = $b; $b->a = $a; unset($a); unset($b);
在这种设计不佳的情况下,即使我们取消设置 $a 和 $b,PHP 也不会释放内存,因为它们相互引用,导致 PHP 认为它们仍在使用中。
幸运的是,还有另一种称为循环收集器的机制:
gc_collect_cycles();
粗略地说,收集器会遍历所有引用并应用一种算法来标记正在使用的对象,从而显示要收集的对象(未标记的对象)。
但是,PHP 不会触发自动循环收集,直到达到具有潜在循环引用的 10,000 个对象 的阈值。
再次强调,这不是魔法,因此只有在少数情况下才必须调用 gc_collect_cycles()。
?坦斯塔足球俱乐部
糟糕的设计可能会导致对象之间的关系过于复杂,从而导致更多的引用和更频繁的垃圾回收。
每个引用计数对象都需要额外的存储空间来存储其引用计数。
来源:维基百科 - 引用计数
与内存清理操作相关的开销会显着影响全局性能,并最终增加特定场景中的执行时间。
10 年前,Composer 仅通过使用 gc_disable() 函数就获得了巨大的性能提升。
来源:Composer - 禁用 GC
确实,PHP 7 极大地改进了 GC,所以现在已经不是 2014 年的样子了。
此外,PHP 8 版本改进了内存分配策略,并添加了更多有关 GC 操作的有用统计信息,以便更好地监控(8.3 中的 gc_status())。
大多数PHP应用程序都是请求驱动的,请求结束时内存会自动清除。
再说一遍,这很酷,但并不神奇。异步请求和长期存在的对象/守护进程会发生什么?
您可能会在某些时候遇到内存泄漏。
? PHP 的 GC 有何不同?
此时,你可能还看不出 PHP 的 GC 与其他语言有何不同。
大多数时候,其他语言不依赖引用计数来收集垃圾,或者可能使用不同的实现。
例如,许多使用跟踪算法,该算法也标记未使用的对象,但不会增量操作。这是一个图的遍历。
此外,某些语言不允许这种直接控制(例如,运行时开/关)。
像往常一样,有一些优点和不方便,所以你可能会看到一些混合方法。
??与 PHP 的 GC 交互
您可以利用内置的 gc_* 帮助程序。
例如:
- gc_collect_cycles 手动触发垃圾收集
- gc_status() 给出当前状态
- gc_disable() 禁用它
- gc_enable() 启用它
这些函数有助于调试或微调垃圾收集必要时。
?了解内存错误
您可以阅读这篇文章以获取更多见解:

PHP:内存错误
spO0q ? ・ 2023 年 5 月 24 日
?弱地图可以拯救吗?
PHP 7.4 引入了弱引用,PHP 8 引入了弱映射。
弱映射可以被描述为弱引用的集合。
此数据结构是一种多功能键值存储,可帮助 PHP 跟踪项目,而不会造成混乱或消耗过多空间。
您可能会将其视为临时存储,当不再需要时将立即清除,因为没有[强]引用可以阻止垃圾收集:
class A { public $b; } class B { public $a; } $a = new A(); $b = new B(); $a->b = $b; $b->a = $a; unset($a); unset($b);
✅ 优点
- 非常简单
- 非常适合缓存或记忆(例如,昂贵的计算)
❌ 缺点
- 虽然键(对象)不会阻止垃圾回收,但值可以,因此术语“任意值”可能会产生误导(仅使用简单数据类型作为值)
- 有价值的用例是有限的
?优化代码
- 利用减少相互依赖性的设计模式
- 使用依赖注入
- 不要将太大的数据集加载到内存中,并使用集合和生成器而不是巨大的数组
- 监控内存使用情况
- 使用指标分析您的代码
- 谨慎使用 gc_enable()、gc_disable() 和 gc_collect_cycles()
包起来
对于大多数用法,您不必担心内存管理,因为 PHP 已经处理了它。
但是,由于现代堆栈使用长寿命对象,因此您需要监视应用程序是否存在潜在的内存泄漏。
如果遇到问题,您可能需要优化代码和/或直接与 GC 交互。
以上是PHP:用简单的话解释垃圾收集器的详细内容。更多信息请关注PHP中文网其他相关文章!

使用数据库存储会话的主要优势包括持久性、可扩展性和安全性。1.持久性:即使服务器重启,会话数据也能保持不变。2.可扩展性:适用于分布式系统,确保会话数据在多服务器间同步。3.安全性:数据库提供加密存储,保护敏感信息。

在PHP中实现自定义会话处理可以通过实现SessionHandlerInterface接口来完成。具体步骤包括:1)创建实现SessionHandlerInterface的类,如CustomSessionHandler;2)重写接口中的方法(如open,close,read,write,destroy,gc)来定义会话数据的生命周期和存储方式;3)在PHP脚本中注册自定义会话处理器并启动会话。这样可以将数据存储在MySQL、Redis等介质中,提升性能、安全性和可扩展性。

SessionID是网络应用程序中用来跟踪用户会话状态的机制。1.它是一个随机生成的字符串,用于在用户与服务器之间的多次交互中保持用户的身份信息。2.服务器生成并通过cookie或URL参数发送给客户端,帮助在用户的多次请求中识别和关联这些请求。3.生成通常使用随机算法保证唯一性和不可预测性。4.在实际开发中,可以使用内存数据库如Redis来存储session数据,提升性能和安全性。

在无状态环境如API中管理会话可以通过使用JWT或cookies来实现。1.JWT适合无状态和可扩展性,但大数据时体积大。2.Cookies更传统且易实现,但需谨慎配置以确保安全性。

要保护应用免受与会话相关的XSS攻击,需采取以下措施:1.设置HttpOnly和Secure标志保护会话cookie。2.对所有用户输入进行输出编码。3.实施内容安全策略(CSP)限制脚本来源。通过这些策略,可以有效防护会话相关的XSS攻击,确保用户数据安全。

优化PHP会话性能的方法包括:1.延迟会话启动,2.使用数据库存储会话,3.压缩会话数据,4.管理会话生命周期,5.实现会话共享。这些策略能显着提升应用在高并发环境下的效率。

thesession.gc_maxlifetimesettinginphpdeterminesthelifespanofsessiondata,setInSeconds.1)它'sconfiguredinphp.iniorviaini_set().2)abalanceIsiseededeedeedeedeedeedeedto to to avoidperformance andununununununexpectedLogOgouts.3)

在PHP中,可以使用session_name()函数配置会话名称。具体步骤如下:1.使用session_name()函数设置会话名称,例如session_name("my_session")。2.在设置会话名称后,调用session_start()启动会话。配置会话名称可以避免多应用间的会话数据冲突,并增强安全性,但需注意会话名称的唯一性、安全性、长度和设置时机。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

禅工作室 13.0.1
功能强大的PHP集成开发环境