background image

php 引用计数器和垃圾回收机制

谈到引用计数器和垃圾回收机制,必须得从

php 变量说起。总所周知,php

是一种弱类型,但具体表现在哪里,程序里面又是怎么表现的呢?

php 里面又

是怎样实现引用计数器的,程序如何区分变量引用和复制?

php 是如何对已用

完的变量进行回收,不同的

php 版本的不同的垃圾回收机制又是如何实现的?

1.

引用计数器

讲到引用计数器,不得不先说一下变量的

c 语言实现。如下,几个变量的结构体和联合

体:

zvalue_value 联合体:

typedef union _zvalue_value {  

 

long lval;                  

/* long value */

 

 

double dval;                

/* double value */

 

struct {  

char *val;  

 

int len;  

} str;  
H

as

hTable *ht;              

/* hash table value */

 

 

zend_object_value obj;  

} zvalue_value;  

zval

的结构:

struct _zval_struct {  

 

/* Variable information */

 

 

zvalue_value value;       

/* value */

 

zend_uint refcount__gc;  

 

zend_uchar type;    

/* active type */

 

 

zend_uchar is_ref__gc;  

};  

zval 可以看成一个容器,zvalue_value 是该容器存储变量值的联合体,

refcount__gc 是引用计数,记录引用数,is_ref__gc 是标志这个容器是否真正的引用,
type 表示这个变量的类型。

zend 根据 type 值来决定访问 value 的哪个成员,可用值如下:

IS_NULL

N/A

IS_LONG

对应

value.lval

IS_DOUBLE

对应

value.dval

IS_STRING

对应

value.str

IS_ARRAY

对应

value.ht

IS_OBJECT

对应

value.obj

IS_BOOL

对应

value.lval.

IS_RESOURCE

对应

value.lval