PHP的垃圾回收机制

php的垃圾回收机制基于的是zval变量容器。

一般情况

一个zval变量容器,除了包含变量的类型和值,还包含两个字节的额外信息,第一个是is_ref,是个bool值,用来区分变量是否是属于引用类型;第二个是refcount,表示指向这个zval变量容器的变量个数。

当一个变量被赋常量值时,就会生成一个zval变量容器。例如$a = "name";,生成的变量容器是包括了type是string,value是”name”,is_ref是false,refcount是1。

简单地说,只要定义了,refcount就是1,当使用unset()或者脚本结束,refcount就会变成0,当该字段变成0的时候变量就会释放掉了。当出现$b = $a的时候,$a的refcount字段加1。

复合类型

当遇到复合类型的变量,像是array和object类型,和标量有不同的地方,array和object类型的变量把它们的成员或属性存在自己的符号表中,也就是说本体创建一个容器,成员和属性也要依次创建容器。例如$a = array( 'meaning' => 'life', 'number' => 42 );就会生成3个zval变量容器。

refcount字段的变化参考标量类型的变量来做,数组元素存在共用一个容器字段refcount的情况。

清理变量容器的问题

因为变量创建的时候会使refcount字段不为0,只有使用unset()和脚本结束的时候会销毁,所以当出现大量未销毁的变量时,要注意处理,释放掉。不然会占用大量内存。