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.';