垃圾回收 - PHP 7下变量的zval的refcount为何是2?
本文介绍了垃圾回收 - PHP 7下变量的zval的refcount为何是2?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
代码如下:
<?php
$a = "hello world";
xdebug_debug_zval('a');
然后在PHP7下运行:
a: (refcount=2, is_ref=0)='hello world'
在PHP5.5下运行:
a: (refcount=1, is_ref=0)='hello world'
PHP 7的版本信息如下:
PHP 7.1.5 (cli) (built: May 9 2017 19:49:10) ( ZTS MSVC14 (Visual C++ 2015) x64 )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
with Xdebug v2.5.4, Copyright (c) 2002-2017, by Derick Rethans
PHP 5.5的版本信息如下:
PHP 5.5.1 (cli) (built: Jul 18 2013 10:56:37)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2013 Zend Technologies
with Xdebug v2.2.3, Copyright (c) 2002-2013, by Derick Rethans
为何PHP 7下变量的zval的refcount为何是2?
更新:今天再试了一下,在cmd命令下PHP 7.1还是显示2,然后通过浏览器访问的话,就是1,正常了,再去试了一下PHP7.0的,结果更诡异,显示的是0,如下:
λ C:\phpStudy\php\php-7.0.12-nts\php.exe -f test_zval.php
Hello_world: (refcount=0, is_ref=0)='hello world'
PHP版本如下:
λ C:\phpStudy\php\php-7.0.12-nts\php.exe -v
PHP 7.0.12 (cli) (built: Oct 13 2016 11:04:07) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
with Xdebug v2.4.1, Copyright (c) 2002-2016, by Derick Rethans
感觉很有可能是我本地环境的问题,尤其是laragon集成环境的问题
解决方案
如果第一次访问 引用是1
如果第二次访问 会变2
其实这个是PHP7.1
的一个特性。
大家会发现第一次使用php7
去访问程序的时候,会有点慢,而第二次之后会变快很多。
只要运行过一次PHP,JIT
就会启动。JIT
会优化字面量的代码,将其放在内存的静态区(全局区),并且会合并一些相同的字面量,因为字面量也是一段内存,本身自然是1
。所以当变量再去指向它时候,就变作2
了。
并且PHP 7
做了一些优化,如果$a = '2222';$b = $a;
,此时$b并未做深拷贝,只是将引用+1,两者指向的同一内存,当对$b进行修改的时候,才Copy
一份来修改,这样效率就做到了提升。
这应该是7.1
的JIT特性
,我测试PHP 7.0
都是1
的。
echo PHP_VERSION, PHP_EOL;
$a = 'hello';
xdebug_debug_zval('a');
7.1.1
a: (refcount=1, is_ref=0)='hello world'
这篇关于垃圾回收 - PHP 7下变量的zval的refcount为何是2?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文