前言
PHP 是一门托管型语言,在 PHP 编程中程序员不需要手工处理内存资源的分配与释放
(使用
C 编写 PHP 或 Zend 扩展除外),这就意味着 PHP 本身实现了垃圾回收机制
(
Garbage Collection)。现在如果去 PHP 官方网站(php.net)可以看到,目前
PHP5 的两个分支版本 PHP5.2 和 PHP5.3 是分别更新的,这是因为许多项目仍然使用
5.2 版本的 PHP,而 5.3 版本对 5.2 并不是完全兼容。PHP5.3 在 PHP5.2 的基础上做
了诸多改进,其中垃圾回收算法就属于一个比较大的改变。本文将分别讨论
PHP5.2
和
PHP5.3 的垃圾回收机制,并讨论这种演化和改进对于程序员编写 PHP 的影响以及
要注意的问题。
PHP 变量及关联内存对象的内部表示
垃圾回收说到底是对变量及其所关联内存对象的操作,所以在讨论
PHP 的垃圾回收机
制之前,先简要介绍
PHP 中变量及其内存对象的内部表示(其 C 源代码中的表示)。
PHP 官方文档中将 PHP 中的变量划分为两类:标量类型和复杂类型。标量类型包括布
尔型、整型、浮点型和字符串;复杂类型包括数组、对象和资源;还有一个
NULL 比
较特殊,它不划分为任何类型,而是单独成为一类。
所有这些类型,在
PHP 内部统一用一个叫做 zval 的结构表示,在 PHP 源代码中这个
“
结构名称为
_zval_struct”。zval 的具体定义在 PHP
“
源代码的
Zend/zend.h”文件
中,下面是相关代码的摘录。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
typedef
union
_zvalue_value {
long
lval; /* long value */
double
dval; /* double value */
struct
{
char
*val;
int
len;
} str;
HashTable *ht; /* hash table value */
zend_object_value obj;
} zvalue_value;
struct
_zval_struct {
/* Variable information */
zvalue_value value; /* value */
zend_uint refcount__gc;
zend_uchar type; /* active type */
zend_uchar is_ref__gc;
};