php引用计数器进行垃圾收集机制介绍


Posted in PHP onSeptember 19, 2012

PHP 有一个非常简单的垃圾收集器,它实际上将对不再位于内存范围(scope)中的对象进行垃圾收集。垃圾收集的内部方式是使用一个引用计数器,因此当计数器达到 0 时(意味着对该对象的引用都不可用),对象将被当作垃圾收集并从内存中删除。

每一种计算机语言都有自己的自动垃圾回收机制,让程序员不必过分关心程序内存分配,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()删除

PHP 相关文章推荐
php面向对象全攻略 (十四) php5接口技术
Sep 30 PHP
PHP网站安装程序制作的原理、步骤、注意事项和示例代码
Aug 01 PHP
php URL验证正则表达式
Jul 19 PHP
PHP几个数学计算的内部函数学习整理
Aug 06 PHP
PHP APC的安装与使用详解
Jun 13 PHP
浅析PHP原理之变量(Variables inside PHP)
Aug 09 PHP
php实现mysql备份恢复分卷处理的方法
Dec 26 PHP
使用PHP如何实现高效安全的ftp服务器(一)
Dec 20 PHP
在openSUSE42.1下编译安装PHP7 的方法
Dec 24 PHP
php UNIX时间戳用法详解
Feb 16 PHP
PHP substr()函数参数解释及用法讲解
Nov 23 PHP
PHP网页缓存技术优点及代码实例
Jul 29 PHP
mysql,mysqli,PDO的各自不同介绍
Sep 19 #PHP
php数组相加 array(“a”)+array(“b”)结果还是array(“a”)
Sep 19 #PHP
PHP输入流php://input介绍
Sep 18 #PHP
PHP爆绝对路径方法收集整理
Sep 17 #PHP
php中inlcude()性能对比详解
Sep 16 #PHP
微博短链接算法php版本实现代码
Sep 15 #PHP
PHP优于Node.js的五大理由分享
Sep 15 #PHP
You might like
使用sockets:从新闻组中获取文章(一)
2006/10/09 PHP
支持中文和其他编码的php截取字符串函数分享(截取中文字符串)
2014/03/13 PHP
浅谈COOKIE和SESSION区别
2015/07/19 PHP
PHP实现递归无限级分类
2015/10/22 PHP
Yii2实现增删改查后留在当前页的方法详解
2017/01/13 PHP
javascript实现二分查找法实现代码
2007/11/12 Javascript
JavaScript 监听textarea中按键事件
2009/10/08 Javascript
基于JQuery模仿苹果桌面的Dock效果(初级版)
2012/10/15 Javascript
javascript 10进制和62进制的相互转换
2014/07/31 Javascript
node.js中的console.assert方法使用说明
2014/12/10 Javascript
javascript 构造函数方式定义对象
2015/01/02 Javascript
可以浮动某个物体的jquery控件用法实例
2015/07/24 Javascript
利用Angular.js限制textarea输入的字数
2016/10/20 Javascript
详解使用React进行组件库开发
2018/02/06 Javascript
详解JavaScript中的数组合并方法和对象合并方法
2018/05/11 Javascript
解决Layui选择全部,换页checkbox复选框重新勾选的问题方法
2018/08/14 Javascript
react-native聊天室|RN版聊天App仿微信实例|RN仿微信界面
2019/11/12 Javascript
详解JavaScript中的Object.is()与"==="运算符总结
2020/06/17 Javascript
[01:01:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第一场 3月4日
2021/03/11 DOTA
解决python线程卡死的问题
2019/02/18 Python
window7下的python2.7版本和python3.5版本的opencv-python安装过程
2019/10/24 Python
TensorFlow学习之分布式的TensorFlow运行环境
2020/02/05 Python
Pycharm Git 设置方法
2020/09/15 Python
美国一家著名的儿童鞋制造商:Stride Rite
2017/01/02 全球购物
全球烹饪课程的领先预订平台:Cookly
2020/01/28 全球购物
幼儿园家长会邀请函
2014/01/15 职场文书
研究生毕业鉴定
2014/01/29 职场文书
销售总经理岗位职责
2014/03/15 职场文书
会计岗位说明书
2014/07/29 职场文书
暑期政治学习心得体会
2014/09/02 职场文书
暑假社会实践心得体会
2014/09/02 职场文书
中小学生学籍证明
2014/10/25 职场文书
升职自荐书
2019/05/09 职场文书
关于拾金不昧的感谢信(五篇)
2019/10/18 职场文书
关于 Python json中load和loads区别
2021/11/07 Python
CSS子盒子水平和垂直居中的五种方法
2022/07/23 HTML / CSS