background image

PHP 垃圾回收机制

每一种计算机语言都有自己的自动垃圾回收机制,让程序员不必过分关心程序内存分配 ,
php 也不例外,但是在面向对象编程(OOP)编程中,有些对象需要显式的销毁;防止程序执
行内存溢出。

 

一、

PHP 垃圾回收机制(Garbage Collector 简称 GC) 

PHP 中,没有任何变量指向这个对象时,这个对象就成为垃圾。PHP 会将其在内存中销

毁;这是

PHP 的 GC 垃圾处理机制,防止内存溢出。 

当一个

PHP 线程结束时,当前占用的所有内存空间都会被销毁,当前程序中所有对象同时

被销毁。

GC 进程一般都跟着每起一个 SESSION 而开始运行的.gc 目的是为了在 session 文件

过期以后自动销毁删除这些文件

二、

__destruct /unset 

__destruct() 析构函数,是在垃圾对象被回收时执行。 
unset 销毁的是指向对象的变量,而不是这个对象。 

三、

 Session 与 GC 

由于

PHP 的工作机制,它并没有一个 daemon 线程来定期的扫描 Session 信息并判断其是否

失 效 , 当 一 个 有 效 的 请 求 发 生 时 ,

PHP  会 根 据 全 局 变 量   session.gc_probability 和

session.gc_divisor 的值,来决定是否启用一个 GC, 在默认情况下,session.gc_probability=1, 
session.gc_divisor =100 也就是说有 1%的可能性启动 GC(也就是说 100 个请求中只有一个 gc
会伴随

100 个中的某个请求而启动). 

GC 的工作就是扫描所有的 Session 信息,用当前时间减去 session 最后修改的时间,同
session.gc_maxlifetime 参数进行比较,如果生存时间超过 gc_maxlifetime(默认 24 分钟),就将

session 删除。 

但是,如果你

Web 服务器有多个站点,多个站点时,GC 处理 session 可能会出现意想不到的

结果,原因就是:

GC 在工作时,并不会区分不同站点的 session. 

那么这个时候怎么解决呢?

 

1. 修改 session.save_path,或使用 session_save_path()让每个站点的 session 保存到一个专用目
录,

 

2. 提供 GC 的启动率,自然,GC 的启动率提高,系统的性能也会相应减低,不推荐。 
3. 在代码中判断当前 session 的生存时间,利用 session_destroy()删除.

看下面的例子

Example 1: gc.php
<?php 
error_reporting(E_ALL); 
$a = 'I am test.';