搬砖笔记:PHP中的写时复制(Copy On Write)的代码实例分享

PHP中的写时复制机制(Copy-on-Write)详解 在PHP中,写时复制机制用于数组和对象的复制操作,以提高性能和节省内存。只有在其中一个变量被修改时,系统才会为该变量分配新的内存空间,并将数据复制到新的内存中,使得修改操作不会对其他变量产生影响。在上面的示例中,如果没有写时复制机制,每次赋值操作都会立即复制整个数组的数据,这将导致不必要的内存消耗。但是,由于写时复制机制的存在,只有在真正需要修改数据时才会进行复制操作,从而减少了内存开销。当多个变量引用相同的数据时,它们共享同一块内存,只有在其中一个变量被修改时,才会进行实际的复制操作。 阅读详情

问题引入
首先来看看PHP中的赋值与引用问题

<?php$a = 10;//将常量值赋给变量,会为a分配内存空间 $b = $a;//变量赋值给变量,是不是copy了一份副本,b也分配了内存空间呢? $c = &$a;//引用是不会为c分配空间的,c和a是共用一份空间的。?>

对于中间的那个问题,你的答案是什么呢?在今天之前,我的答案是会为b分配内存空间。因为我是这么理解的:
  &赋值的时候,视为一个变量定义了一个别名,增加了一个对内存空间的引用。改变其中一个,会影响其他的引用。而使用unset()时,只是断开了对变量内存空间的引用,内存空间不会释放。
  而 = 赋值则不同,它会重新开辟一份内存空间存储原变量的副本。两者之间的修改不会相互影响。

而下面的程序则印证了这一点:

<?php$a = 10; //将常量值赋给变量,会为a分配内存空间 $b = $a; //变量赋值给变量,是不是copy了一份副本,b也分配了内存空间呢? $c = &$a; //引用是不会为c分配空间的,c和a是共用一份空间的。 $a = 5;echo $c; //输出5,因为a和c 是指向同一个内存空间echo PHP_EOL; echo $b; //由于b是副本,对a的操作不会影响b,输出10?>

那如果

$b = $a;//之后a 和 b 都不做任何改变,保持一致

有这么一个问题,如果 = 赋值之后,两个变量都不曾改变,如果是两份副本,岂不是太浪费内存?
  PHP中实际上避免了这种情况。
  PHP中将一个变量赋值给新变量时,不会立即为新变量分配内存空间,只是增加了对内存空间的引用。当原变量或者新变量作出任何改变时,才会为新变量 分配一块内存空间。

<?php$a = 1;$b = $a; echo $a;//在此之前,b都是和a共用内存空间的。 $a = 2;//a作出了改变,此时b才会有自己的空间?>

每个php变量存在一个叫”zval”的变量容器中。一个zval变量容器,除了包含变量的类型和值,还包括两个字节的额外信息。第一个是”is_ref”,是个bool值,用来标识这个变量是否是属于引用集合(referenceset)。通过这个字节,php引擎才能把普通变量和引用变量区分开来,由于php允许用户通过使用&来使用自定义引用,zval变量容器中还有一个内部引用计数机制,来优化内存使用。第二个额外字节是”refcount”,用以表示指向这个zval变量容器的变量(也称符号即symbol)个数。当”refcount”的值是1时,”is_ref”的值总是FALSE.

安装xdebug之后,利用xdebug_debug_zval(),可以看到zval结构:
  如下:

<?php $a = 1; $b = $a; echo $a;//在此之前,b都是和a共用内存空间的。xdebug_debug_zval('b'); $a = 2;//a作出了改变,此时b才会有自己的空间xdebug_debug_zval('b');?>

输出:

b:

(refcount=2, is_ref=0),

int

1

b:

(refcount=1, is_ref=0),

int

1

由上面的结果可以看到,在a作出改变之前,引用计数是2 ,当a作出改变之后,b的引用计数变为1,是因为b重新分配了空间。
  上面说描述的现象就是写时复制。

写时复制
  写时复制(Copy-on-Write,也缩写为COW),顾名思义,就是在写入时才真正复制一份内存进行修改。 COW最早应用在*nix系统中对线程与内存使用的优化,后面广泛的被使用在各种编程语言中,如C++的STL等。 在PHP内核中,COW也是主要的内存优化手段。 在前面关于变量和内存的讨论中,引用计数对变量的销毁与回收中起着至关重要的标识作用。 引用计数存在的意义,就是为了使得COW可以正常运作,从而实现对内存的优化使用。
   写时复制优点:是通过赋值的方式赋值给变量时不会申请新内存来存放新变量所保存的值,而是简单的通过一个计数器来共用内存,只有在其中的一个引用指向变量的值发生变化时才申请新空间来保存值内容以减少对内存的占用。

从PHP底层基础数据结构来看

ref_count和is_ref是定义于zval结构体中;
is_ref标识是不是用户使用 & 的强制引用;
ref_count是引用计数,用于标识此zval被多少个变量引用,即写时复制的自动引用,为0时会被销毁。

一键复制内容 一键复制兼容苹果手机,一键复制兼容苹果手机一键复制兼容苹果手机一键复制兼容苹果手机一键复制兼容苹果手机= 立即下载

相关推荐

PHP中copy on write写时复制机制介绍

什么是写时复制(Copy On Write)? 答:在复制一个对象的时候并不是真正的把原先的对象复制到内存的另外一个位置上,而是在新对象的内存映射表中设置一个指针,指向源对象的位置,并把那块内存的Copy-On-Write位设置为1.这样,在对新的对象执行读操作的时候,内存数据不发生任何变动,直接执行读操作;而在对新的对象执行写操作时,将真正的对象复制到新的内存地址中,并修改新对象的内存映射表指向这个新的位置,并在新的内存位置上执行写操作。 这个技术需要跟虚拟内存和分页同时使用,好处就是在执行复制操作时因为不是真正的内存复制,而只是建立了一个指针,因而大大提高效率。但这不是一直成立的,如果在复

TRACEPaw开源项目:仿生机器人足部感知技术解析

机器人环境感知是智能移动系统的核心技术之一,通过模拟生物感知机制实现自主适应能力。TRACEPaw项目创新性地结合视觉形变分析和音频特征识别,利用Arduino Nicla Vision开发板搭载的机器学习模型,实现了类似四足动物的地面特性感知。该技术采用STM32H7微控制器实时处理传感器数据,通过硅胶足垫形变估算三维力矢量,同时利用声音特征识别地形类型。在工程实践中,项目团队展示了传感器融合与模型量化的典型优化方法,包括将图像分辨率从VGA降至QVGA、量化模型至int8精度等技巧,使推理时间从38ms

weixin_30251829的博客 621

解决RK3566 USB OTG模式识别问题:从原理图分析到otg_mode文件操作全解析

本文深入解析RK3566 USB OTG模式识别问题,从硬件原理图设计到Linux内核的otg_mode文件操作,提供全面的调试方案。针对USB_OTG0_ID引脚电路设计、电源管理关联及内核驱动交互等关键点,给出实战调试技巧和常见问题解决方案,帮助开发者高效解决USB OTG模式切换难题。

eee77的博客 866

php源码复制,PHP目录/文件拷贝/复制自定义函数分享

本文我们分享两个PHP复制目录或者文件的自定义函数dir_copy($src = '', $dst = ''),后面分享的函数可以复制文件夹及下面所有文件。文件夹文件拷贝/复制函数如下/*** 文件夹文件拷贝** @param string $src 来源文件夹* @param string $dst 目的地文件夹* @return bool*/function dir_copy($src = '...

weixin_34515452的博客 185

VMware Converter 6.2.0保姆级教程:从物理机到ESXi主机的完整迁移指南(含常见错误排查)

本文提供VMware Converter 6.2.0从物理机迁移至ESXi主机的完整保姆级教程。详细解析了迁移前的环境规划、核心转换过程步骤、版本差异对比,并重点针对代理安装失败、任务卡顿、虚拟机无法启动等常见错误提供了实战排查与解决方案,确保P2V迁移顺利进行。

sam99的博客 380

ComfyUI安装包运行前准备:安装Git

Git 是一个分布式版本控制系统(Version Control System, VCS),用于跟踪和管理文件(尤其是代码)的变更历史。 简单理解就是,git是用来管理文件的版本的,如果有新的版本,就可以使用git来更新。

聚梦小课堂 2万+

php写时拷贝,PHP写时复制(Copy On Write)

从一个例子说起:很明显在这段代码执行以后,$var_dup 的值应该还是”laruence”, 那么这又是怎么实现的呢?这就是 PHP 的 copy on write 机制:PHP 在修改一个变量以前,会首先查看这个变量的 refcount,如果 refcount 大于1,PHP 就会执行一个分离的例程, 对于上面的代码,当执行到第三行的时候,PHP 发现 $var 指向的 zval 的 refc...

weixin_39612332的博客 140

实战指南:基于Windows Server构建企业级AAA认证体系

本文详细介绍了如何在Windows Server环境下构建企业级AAA认证体系,涵盖AD域服务部署、NPS服务器配置及华为设备对接实战。通过整合Radius协议与AD域账号管理,实现网络设备的统一认证与权限控制,提升企业IT安全管理效率。特别适用于需要零成本实现AAA认证的中大型企业。

weixin_28304023的博客 422

谈一谈PHP变量或参数的Copy On Write机制

关于php的copy on wirte(写时复制) 特性,本文不做研究,可以参考官方文档了解 在php中标量数据类型(int 、float、bool、string)加上array这些类型作为函数或者类方法的参数时,默认都是按值传递的。 但是对象(object) 例外,在php5以后,object默认按引用传递。(但是不完全等于&引用传递),总结来说对象参数重新new构造一个全新的时候,会发生copy on write,而&引用传参,都是指向同一个内存空间,不会发生copy on w...

ndrandy的博客 382

【VMware】win 10:VMware 15 虚拟机安装 win 7 系统

目录 一、准备虚拟机 二、win7 ghost ISO镜像文件下载 三、VMware新建虚拟机 四、VMware安装win7 五、解决vmware虚拟机屏幕没有适应窗口全屏问题 一、准备虚拟机 查看我的另一博文:【VMware】VMware Workstation Pro15 虚拟机永久激活破解安装教程 二、win7 ghost ISO镜像文件下载 百度网盘下载地址:点击前往下载...

顾三殇 —— 博客空间(软件测试) 11万+

华为OD机试真题 新系统【进制转换后自定义排序】

华为OD机试 新系统真题【进制转换后自定义排序】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【进制转换后自定义排序】多语言题解。

qq_45776114的博客 596

学习笔记——写时复制(Copy-on-Write)

摘要:写时复制(COW)是一种延迟资源复制的优化技术,多个调用者初始共享同一资源,仅当修改时才创建副本。该技术通过引用计数和内存页保护实现透明操作,显著提升fork()等系统调用性能,减少内存占用。广泛应用于操作系统、编程语言和存储系统,虽存在首次写入延迟等缺点,但通过批量复制等优化策略可缓解。COW体现了"延迟优化"的设计思维,在资源节约和性能间取得平衡。

2301_78295956的博客 990

56、CAN总线RC低通滤波器截止频率计算与实战

本文详细探讨了CAN总线RC低通滤波器的设计与应用。作者通过实际项目案例,分析了CAN总线噪声频谱特性,提出截止频率计算的"黄金法则",强调需考虑收发器输入阻抗的并联效应。文章给出RC参数选择的经验值(R=100Ω-1kΩ,C=10pF-100pF),并指出PCB布局的关键要点:RC应紧贴收发器引脚,电容接地端需直接连接地平面。最后建议结合示波器和眼图验证效果,并提醒RC滤波器只是抗干扰方案的一部分,良好的PCB布局设计才是根本。

2401_88858637的博客 71

Copy-On-Write写时复制

Copy-On-Write解决的问题早期Unix系统创建进程的方式存在缺陷:当发出fork()系统调用时,内核原样复制父进程的整个地址空间并把复制的那一份分配给子进程。这种行为是非常耗时的,因为它需要:   - 为子进程的页表分配页帧   - 为子进程的页分配页帧   - 初始化子进程的页表   - 把父进程的页复制到子进程相应的页中这种创建地址空间的方法涉及许多内存访问,消耗许多CPU周期

pepping798的专栏 755

QCC51XX---人机接口设备协议( HID)

QCC51XX---人机接口设备协议( HID)

weixin_42162924的博客 819

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

php Zend_string 与 写时复制( copy on write )

一、 zend_string 结构体 定义 struct _zend_string { zend_refcounted_h gc; zend_ulong h; /* hash value */ size_t len; char val[1]; }; 二、写时复制 写时复制:对于整...

坚持 497

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

php 复制复制,PHP中的写时复制(Copy On Write)的代码实例分享

问题引入首先来看看PHP中的赋值与引用问题

weixin_39671621的博客 113

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Copy-On-Write (COW) 写时复制机制

Copy-On-Write(COW)是一种延迟复制策略,允许多个调用方共享数据直到需要修改时才进行实际复制。它解决了"共享"与"修改隔离"之间的矛盾,广泛应用于操作系统(Linux fork)、编程语言(Python字符串)、数据库(Redis持久化)和版本控制(Git)等领域。COW通过将共享内存页标记为只读,在写入时触发缺页中断并创建副本,实现高效的内存共享。其核心假设是数据读取频率远高于修改频率,适用于读写比高的场景。相比立即复制或完全共享策略,COW在内存效率

小飞的博客 1137

php写时复制文件,PHP 之 写时复制介绍(Copy On Write)

很多时候,我们会因为一些术语而对其概念产生莫测高深的恐惧,而其实,他们的基本原理往往非常简单。本小节将介绍PHP中写时复制这种策略的实现,在开始之前,我们可以先看一段简单的代码:$foo=1;$bar=$foo;echo$foo+$bar;?>执行这段代码,会打印出数字2。从内存的角度来分析一下这段代码“可能”是这样执行的:分配一块内存给foo变量,里面存储一个1; 再分配一块内存给bar...

weixin_29335033的博客 156

php 自动复制,PHP写时复制(Copy On Write)

从一个例子说起:$foo = 1;$bar = $foo;echo $foo + $bar;变量 $foo 赋值给变量 $bar,这两个变量具有相同的值,没有必要新申请内存空间,他们可以共享同一块内存。在很多场景下PHP 的 COW 对内存进行优化。比如:变量的多次赋值、函数参数传递,并在函数体内修改实参等。什么是“复制”这是一段摘自鸟哥博客的例子,说的比较清楚,就直接贴过来了。$var = "l...

weixin_39753674的博客 198

php写时复制文件,PHP写时复制(Copy On Write)

从一个例子说起:

weixin_32068473的博客 178

关于写时复制(copy-on-write)

大部份的STL在实现string时,都采用COW来保证其高效性。即多个类会共用一个数据缓冲区(buffer),在拷贝构造、赋值等操作时,并不会对buffer进行复制。仅在需要对buffer进行修改,而且此buffer已与别的类共享了,才会开辟空间,将buffe

Kay's space 1042

php 的变量什么时候会发生复制.什么时候发生引用?,PHP 之 写时复制介绍(Copy On Write)...

在开始之前,我们可以先看一段简单的代码:代码如下:执行这段代码,会打印出数字2。从内存的角度来分析一下这段代码“可能”是这样执行的:分配一块内存给foo变量,里面存储一个1; 再分配一块内存给bar变量,也存一个1,最后计算出结果输出。事实上,我们发现foo和bar变量因为值相同,完全可以使用同一块内存,这样,内存的使用就节省了一个1,并且,还省去了分配内存和管理内存地址的计算开销。没错,很多涉及...

weixin_29748637的博客 215

php is_write,PHP 之 写时复制介绍(Copy On Write)

在开始之前,我们可以先看一段简单的代码:$foo = 1;$bar = $foo;echo $foo + $bar;?>执行这段代码,会打印出数字2。从内存的角度来分析一下这段代码“可能”是这样执行的:分配一块内存给foo变量,里面存储一个1; 再分配一块内存给bar变量,也存一个1,最后计算出结果输出。事实上,我们发现foo和bar变量因为值相同,完全可以使用同一块内存,这样,内存的使用就...

weixin_39626613的博客 119
上一篇: 搬砖笔记:PHP对象机制
下一篇: 搬砖笔记:PHP常用函数
杨甩甩
博客等级 码龄9年 7粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值