PHP5和PHP7的垃圾回收机制有哪些区别

php5和php7的垃圾回收机制都是利用引用计数

我们先来看看什么叫做引用计数:

由于PHP是用C来写的,C里面有一种东西叫做结构体,我们PHP的变量在C中就是用这种方式存储的

每个PHP的变量都存在于一个叫做zval的容器中,一个zval容器,除了包含变量名和值,还包括两个字节的额外信息,一个叫做'is_ref',是个布尔值,用来表示这个变量是否属于引用集合,通过这个字节,我们php才能把普通变量和引用变量区分开来.第二个额外字节就是'refcount',用来表示指向这个容器的变量的个数

我们在PHP中定义一个变量

$name='看看';

我们现在可以使用xdebug_debug_zval()函数来获得函数内变量的相关信息

xdebug_debug_zval('name');
//输出 name:(refcount=1,is_ref=0)='new String'
现在我们把$name赋值给$money
$money = $name;

再来查看一下:

xdebug_debug_zval('name');
//输出 name:(refcount=2,is_ref=0)='new String'

这时候我们会看到refcount的字段的值增加了1,代表现有两个变量指向了相同的一个名字叫做name的aval容器

根据引用计数的规则,当这个refcount=0的时候,php就会把这个容器当做垃圾进行回收.

同样我们执行

unset($name); //一样也会把name容器的引用计数设置为0

以上的结论只是针对标量类型的,下面我们来看看负责类型的

数组:

$person=['name'=>'请欢','age'=>19];
var_dump(xdebug_debug_zval('person'));
在PHP5输出:
person:
(refcount=1, is_ref=0),
array (size=2)
  'name' => (refcount=1, is_ref=0),string '看看' (length=6)
  'age' => (refcount=1, is_ref=0),int 19

在PHP7中输出:

person:
(refcount=2, is_ref=0)
array (size=2)
  'name' => (refcount=1, is_ref=0)string '看看' (length=6)
  'age' => (refcount=0, is_ref=0)int 19

由此可见,对于复杂的数据类型,PHP5和PHP7的引用计数算法是不一样的

我们来试试循环引用的情况

在上面代码的基础上,添加一行代码

$person['hello'] = $person['name']

在PHP7中输出:

person:
(refcount=1, is_ref=0)
array (size=3)
  'name' => (refcount=3, is_ref=0)string '看看' (length=6)
  'age' => (refcount=0, is_ref=0)int 19
  'hello' => (refcount=3, is_ref=0)string '看看' (length=6)

在PHP5中输出:

person:
(refcount=1, is_ref=0),
array (size=3)
  'name' => (refcount=2, is_ref=0),string '看看' (length=6)
  'age' => (refcount=1, is_ref=0),int 19
  'hello' => (refcount=2, is_ref=0),string '看看' (length=6)

小总结:

PHP5和PHP7的垃圾回收机制都属于引用计数,但是在复杂数据类型的算法处理上:

在 PHP7 中 zval 有了新的实现方式。最基础的变化就是 *zval 需要的内存不再是单独从堆上分配,不再自己存储引用计数。复杂数据类型(比如字符串、数组和对象)的引用计数由其自身来存储。这种实现方式有以下好处:*

*简单数据类型不需要单独分配内存,也不需要计数;*

*不会再有两次计数的情况。在对象中,只有对象自身存储的计数是有效的;*

*由于现在计数由数值自身存储,所以也就可以和非 zval 结构的数据共享,比如 zval 和 hashtable key 之间;*

原创文章,作者:XDBFE,如若转载,请注明出处:http://www.wangzhanshi.com/n/6836.html

(0)
XDBFE的头像XDBFE
上一篇 2025年1月1日 16:33:43
下一篇 2025年1月1日 16:33:45

相关推荐

  • PHP7怎么快速安装WEB服务器

    如何安装web服务器? 学习php7需要安装web服务器,那么新手如何快速安装web服务器 首先我们来简单了解一下,什么叫web服务器 在了解什么是web服务器之前,我们先来了解什…

    2025年1月1日
  • PHP通过表单或URL传递值的示例代码

    一、概述 1. 表单传递数据 表单(Form)是HTML的一部分,用于收集用户输入。在Web应用程序中,表单经常用于注册、登录、搜索或提交其他类型的数据。表单中的数据可以通过POS…

    php 2024年12月17日
  • PHP7 垃圾回收机制是什么?

    垃圾回收机制 垃圾回收机制是一种动态存储分配方案。它会自动释放程序不再需要的已分配的内存块。 自动回收内存的过程叫垃圾收集。垃圾回收机制可以让程序员不必过分关心程序内存分配,从而将…

    2025年1月1日
  • php7中函数、声明、返回值等特性的介绍

    使用 … 运算符定义变长参数函数 (PHP 5 >= 5.6.0, PHP 7) 现在可以不依赖 func_get_args(), 使用 … 运算符 …

    php 2025年1月1日
  • php实现简单路由实现伪静态

    伪静态作用 增强搜索引擎的友好性:通过改变动态的网页的URL,使之看起来像静态网页,伪静态技术有助于提高网站在搜索引擎中的表现,使网站内容更易被搜索引擎抓取和索引。 提升用户信任度…

    php 2024年12月17日
  • php7连不上mysql8该怎么办

    php7连不上mysql8怎么解决? mysql 8 php 7连接失败 解决办法 连接mysql 8 时提示未能授权连接,错误所示: Warning: mysqli::__con…

    2025年1月1日
  • php函数版本更新的方法和使用工具

    更新 php 函数版本至关重要,可提高安全性、性能和代码可维护性。详细描述:评估影响:确定依赖于过时函数的代码并评估更新影响。制定计划:制定分阶段更新计划,从不重要函数开始。编写测…

    php 2024年12月17日
  • php5与php7的区别有哪些

    php5与php7的区别是什么?下面本篇文章就来给大家对比一下php5与php7,介绍php5与php7之间的区别。有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 …

    2025年1月1日
  • 如何解决php5 apache22.dll找不到的问题

    php5apache22.dll找不到的解决办法:首先在php官网中选择“window download”进行下载;然后直接下载32位操作系统;最后进行解压重新安装即可找到“php…

    2025年1月2日
  • 聊聊 PHP 8 新特性 Attributes

    PHP8的Alpha版本,过几天就要发布了,其中包含了不少的新特性,当然我自己认为最重要的还是JIT,这个我从2013年开始参与,中间挫折无数,失败无数后,终于要发布的东东。 不过…

    php 2025年1月2日

发表回复

登录后才能评论