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 mysql索引问题
Jun 07 PHP
php完全过滤HTML,JS,CSS等标签
Jan 16 PHP
MongoDB在PHP中的常用操作小结
Feb 20 PHP
php导出csv数据在浏览器中输出提供下载或保存到文件的示例
Apr 24 PHP
ThinkPHP跳转页success及error模板实例教程
Jul 17 PHP
PHP中的日期加减方法示例
Aug 21 PHP
phpMyAdmin安装并配置允许空密码登录
Jul 04 PHP
PHP中的switch语句的用法实例详解
Oct 21 PHP
Zend Framework教程之Autoloading用法详解
Mar 08 PHP
Zend Framework教程之Zend_Config_Xml用法分析
Mar 23 PHP
php实用代码片段整理
Nov 12 PHP
PHP使用ajax的post方式下载excel文件简单示例
Aug 06 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
PHP 开源AJAX框架14种
2009/08/24 PHP
PHP5与MySQL数据库操作常用代码 收集
2010/03/21 PHP
phpMyAdmin 链接表的附加功能尚未激活的问题
2010/08/01 PHP
ThinkPHP 表单自动验证运用示例
2014/10/13 PHP
深入理解PHP的远程多会话调试
2017/09/21 PHP
文字溢出实现溢出的部分再放入一个新生成的div中具体代码
2013/05/17 Javascript
javascript验证身份证完全方法具体实现
2013/11/18 Javascript
随鼠标移动的时钟非常漂亮遗憾的是只支持IE
2014/08/12 Javascript
jQuery 全选 全部选 反选 实现代码
2016/08/17 Javascript
javascript字符串对象常用api函数小结(连接,替换,分割,转换等)
2016/09/20 Javascript
js实现各种复制到剪贴板的方法(分享)
2016/10/27 Javascript
jQuery特殊符号转义的实现
2016/11/30 Javascript
jQuery实现两列等高并自适应高度
2016/12/22 Javascript
详解如何实现一个简单的 vuex
2018/02/10 Javascript
React SSR样式及SEO的实践
2018/10/22 Javascript
vue2.0自定义指令示例代码详解
2019/04/25 Javascript
React优化子组件render的使用
2019/05/12 Javascript
Python基于twisted实现简单的web服务器
2014/09/29 Python
python抓取网页中图片并保存到本地
2015/12/01 Python
Python实现的桶排序算法示例
2017/11/29 Python
python中文编码与json中文输出问题详解
2018/08/24 Python
django-rest-framework解析请求参数过程详解
2019/07/18 Python
python如何提取英语pdf内容并翻译
2020/03/03 Python
基于python实现数组格式参数加密计算
2020/04/21 Python
python实点云分割k-means(sklearn)详解
2020/05/28 Python
python3定位并识别图片验证码实现自动登录功能
2021/01/29 Python
JD Sports丹麦:英国领先的运动时尚零售商
2020/11/24 全球购物
伊莱克斯(Electrolux)俄罗斯网上商店:瑞典家用电器品牌
2021/01/23 全球购物
美国在线肉类和海鲜配送:Crowd Cow
2020/10/02 全球购物
为什么说Ruby是一种真正的面向对象程序设计语言
2012/10/30 面试题
彩色的非洲教学反思
2014/02/18 职场文书
幼儿园中班区域活动总结
2014/07/09 职场文书
财务工作疏忽检讨书
2014/09/11 职场文书
2014年高中生自我评价范文
2014/09/26 职场文书
教师学习三严三实心得体会
2014/10/13 职场文书
java协程框架quasar和kotlin中的协程对比分析
2022/02/24 Java/Android