galaxyhao.github.io - Renhao Li's Blog

Description: 404

next (2075) hexo (1118)

Example domain paragraphs

从下图可以看出,php从下到上是一个4层体系: 阅读全文 » PHP中的垃圾回收机制 发表于 2018-07-31 | 分类于 PHP 引用计数 前面有 几篇文章 提到,PHP中的变量都储存在’zval’这样一个容器中。在’zval’结构体中,存在is_ref和refcount两个元素分别来标志这个变量是否为引用集合(reference set)以及被引用的次数。我们很容易想到,既然refcount表示被引用的次数,那么当refcount=0的时候就表示没有变量指向这个zval容器,那么我们就可以将这个zval容器回收了。这就是引用计数垃圾回收机制。 但是,这样可能会发生循环引用的问题,会造成内存泄露。 1 2 3 4 5 6 7 <?php //step1 $a = array ( 'one' ); $a[] =& $a; //step2 unset ($a); ?>

创建一个数组类型变量$a,给变量$a新增一个元素,该元素为数组变量$a的一个引用。此时变量$a的refcount为2。

前几天在研究PHP引用变量的时候敲测试代码发现了一个很神奇的现象。在使用Xdebug扩展中的xdebug_debug_zval()函数查看变量的引用计数refcount的时候,发现PHP7和PHP5.4输出的结果竟然不一样,而且PHP7中输出的refcount竟然是0。具体测试代码和输出结果如下: 1 2 3 4 echo 'Version: ' .PHP_VERSION.PHP_EOL; $a = 'Hello World' ; debug_zval_dump($a); xdebug_debug_zval( 'a' );