news 2026/6/8 18:34:47

PHP内存管理与垃圾回收机制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PHP内存管理与垃圾回收机制

PHP内存管理与垃圾回收机制

PHP的内存管理对开发者几乎是透明的,但了解底层机制有助于写出更高效的代码。今天说说PHP的内存管理和垃圾回收。

PHP使用引用计数来管理内存。每个变量底层是一个zval结构体,里面有个refcount字段记录有多少个变量指向它。

```php
$a = "Hello World";
// refcount = 1

$b = $a;
// refcount = 2

$c = $b;
// refcount = 3

unset($b);
// refcount = 2

unset($c);
// refcount = 1

unset($a);
// refcount = 0,内存释放
?>
```

写时复制是PHP的一个重要优化。多个变量指向同一份数据时共享内存,只有某个变量要修改时才真正复制。

```php
function copyOnWrite(): void
{
$data = range(1, 100000);
$before = memory_get_usage(true);

$copy = $data; // 不复制,共享
$after = memory_get_usage(true);
echo "共享时内存: " . ($after - $before) . " 字节\n";

$copy[] = 999; // 这里才触发复制
$after2 = memory_get_usage(true);
echo "复制后增加: " . ($after2 - $after) . " 字节\n";
}
copyOnWrite();
?>
```

循环引用是引用计数无法处理的情况。两个对象互相引用,它们的refcount永远不会降到0。

```php
class Node
{
public ?Node $next = null;
public string $name;

public function __construct(string $name)
{
$this->name = $name;
}

public function __destruct()
{
echo "Node {$this->name} 被销毁\n";
}
}

function createCycle(): void
{
$a = new Node('A');
$b = new Node('B');
$a->next = $b;
$b->next = $a;
echo "循环引用创建\n";
unset($a, $b);
echo "函数结束\n";
}

gc_enable();
createCycle();
$collected = gc_collect_cycles();
echo "回收了 {$collected} 个循环引用\n";
?>
```

PHP从5.3开始引入了周期回收算法,专门处理循环引用的垃圾。PHP8做了优化,引入了更快的回收路径。

PHP的内存分配也有自己的策略。Zend Engine维护了内存池,小块内存从池里分配,减少系统调用。每个请求结束后PHP会释放该请求的所有内存,所以即使有内存泄漏也只是在单个请求内有效。

内存暂用和释放的几个原则。减少不必要的变量复制,循环中及时unset大变量,避免循环引用。在Swoole等常驻内存环境中,循环引用的内存泄漏会更严重,需要更注意。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/8 18:34:46

Joplin快捷键终极指南:200+效率操作完全解析

Joplin快捷键终极指南:200效率操作完全解析 【免费下载链接】joplin Joplin - the privacy-focused note taking app with sync capabilities for Windows, macOS, Linux, Android and iOS. 项目地址: https://gitcode.com/GitHub_Trending/jo/joplin 想要在…

作者头像 李华
网站建设 2026/6/8 18:33:55

SAP与WMS集成实战:当发货单要撤回时,我是如何用VL09 BDC + BAPI_OUTB_DELIVERY_CHANGE搞定取消过账和批次拆分还原的

SAP与WMS集成中的发货单撤回实战:VL09 BDC与BAPI_OUTB_DELIVERY_CHANGE的完美组合在SAP与WMS系统集成的复杂环境中,发货单的撤回操作往往成为最棘手的业务场景之一。想象一下这样的情景:仓库管理系统已经完成了发货过账,突然接到客…

作者头像 李华
网站建设 2026/6/8 18:30:13

如何实现iOS应用的实时样式重载:Motif Live Reload功能详解

如何实现iOS应用的实时样式重载:Motif Live Reload功能详解 【免费下载链接】Motif Lightweight and customizable stylesheets for iOS 项目地址: https://gitcode.com/gh_mirrors/mo/Motif Motif是一款轻量级且高度可定制的iOS样式表框架,它提供…

作者头像 李华
网站建设 2026/6/8 18:28:11

ASIL-D级150kW电驱逆变器平台:MPC5775E+GD3100+FS65架构与安全设计详解

1. 项目概述:从零到一,拆解一个符合ASIL-D的150kW电动汽车电驱大脑如果你正在或即将踏入新能源汽车电驱系统开发这个领域,尤其是负责核心的功率逆变器部分,那么“功能安全”、“ASIL-D”、“系统集成”这些词一定让你既兴奋又头疼…

作者头像 李华
网站建设 2026/6/8 18:21:36

ThinkPad风扇终极控制指南:TPFanControl2让你的笔记本更安静高效

ThinkPad风扇终极控制指南:TPFanControl2让你的笔记本更安静高效 【免费下载链接】TPFanCtrl2 ThinkPad Fan Control 2 (Dual Fan) for Windows 10 and 11 项目地址: https://gitcode.com/gh_mirrors/tp/TPFanCtrl2 TPFanControl2是一款专为ThinkPad用户设计…

作者头像 李华