成都网站建设设计

将想法与焦点和您一起共享

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

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

创新互联建站致力于成都网站建设、做网站,成都网站设计,集团网站建设等服务标准化,推过标准化降低中小企业的建站的成本,并持续提升建站的定制化服务水平进行质量交付,让企业网站从市场竞争中脱颖而出。 选择创新互联建站,就选择了安全、稳定、美观的网站建设服务!

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

什么叫做引用计数?

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

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

在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 需要的内存不再是单独从堆上分配,不再自己存储引用计数。复杂数据类型(比如字符串、数组和对象)的引用计数由其自身来存储。

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

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

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

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

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


分享文章:php7的垃圾回收和php5有哪些区别
网址分享:http://chengdu.cdxwcx.cn/article/picdsj.html