php7的垃圾回收和php5有哪些区别

  介绍

这篇文章给大家分享的是有关php7的垃圾回收和php5有哪些区别的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。

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

<强>什么叫做引用计数?

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

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

<强>在php5输出:

人:   (refcount=1, is_ref=0),   数组(大?2)   & # 39;名字# 39;=比;(refcount=1, is_ref=0),字符串& # 39;看看& # 39;(长度=6)   & # 39;年龄# 39;=比;(refcount=1, is_ref=0), int 19

<强>在PHP7中输出:

人:   (refcount=2, is_ref=0)   数组(大?2)   & # 39;名字# 39;=比;(refcount=1, is_ref=0)字符串& # 39;看看& # 39;(长度=6)   & # 39;年龄# 39;=比;(is_ref refcount=0=0) int 19

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

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

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

人美元[& # 39;你好# 39;]=$人[& # 39;名字# 39;]

<强>在PHP7中输出:

人:   (refcount=1, is_ref=0)   数组(大?3)   & # 39;名字# 39;=比;(is_ref refcount=3=0)字符串& # 39;看看& # 39;(长度=6)   & # 39;年龄# 39;=比;(is_ref refcount=0=0) int 19   & # 39;你好# 39;=比;(is_ref refcount=3=0)字符串& # 39;看看& # 39;(长度=6)

<强>在PHP5中输出:

人:   (refcount=1, is_ref=0),   数组(大?3)   & # 39;名字# 39;=比;(refcount=2, is_ref=0),字符串& # 39;看看& # 39;(长度=6)   & # 39;年龄# 39;=比;(refcount=1, is_ref=0), int 19   & # 39;你好# 39;=比;(refcount=2, is_ref=0),字符串& # 39;看看& # 39;(长度=6)

<强>总结:

PHP5和PHP7的垃圾回收机制都属于引用计数,但是在复杂数据类型的算法处理上:在PHP7中zval有了新的实现方式。最基础的变化就是* zval需要的内存不再是单独从堆上分配,不再自己存储引用计数。复杂数据类型(比如字符串,数组和对象)的引用计数由其自身来存储。

<强>这种实现方式有以下好处:

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

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

3,由于现在计数由数值自身存储,所以也就可以和非zval结构的数据共享,比如zval和哈希表关键之间。

感谢各位的阅读!关于PHP7的垃圾回收和PHP5有哪些区别就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到吧!

php7的垃圾回收和php5有哪些区别