background image

前言

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; 
};