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 相关文章推荐
Linux下进行MYSQL编程时插入中文乱码的解决方案
Mar 15 PHP
php递归列出所有文件和目录的代码
Sep 10 PHP
从零开始学YII2框架(五)快速生成代码工具 Gii 的使用
Aug 20 PHP
wamp安装后自定义配置的方法
Aug 23 PHP
PHP has encountered a Stack overflow问题解决方法
Nov 03 PHP
php中获取主机名、协议及IP地址的方法
Nov 18 PHP
php实现的数字验证码及数字运算验证码
Jul 30 PHP
PHP邮件群发机实现代码
Feb 16 PHP
PHP连接MySQL进行增、删、改、查操作
Feb 19 PHP
PHP Laravel 上传图片、文件等类封装
Aug 16 PHP
基于Laravel实现的用户动态模块开发
Sep 21 PHP
搜索附近的人PHP实现代码
Feb 11 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
精致的人儿就要挑杯子喝咖啡
2021/03/03 冲泡冲煮
CodeIgniter框架钩子机制实现方法【hooks类】
2018/08/21 PHP
JQuery结合CSS操作打印样式的方法
2013/12/24 Javascript
javascript向后台传送相同属性的参数即数组参数
2014/02/17 Javascript
nodejs文件操作模块FS(File System)常用函数简明总结
2014/06/05 NodeJs
JavaScript bold方法入门实例(把指定文字显示为粗体)
2014/10/17 Javascript
HTML5使用DeviceOrientation实现摇一摇功能
2015/06/05 Javascript
jquery中ready()函数执行的时机和window的load事件比较
2015/06/22 Javascript
Clipboard.js 无需Flash的JavaScript复制粘贴库
2015/10/02 Javascript
JavaScript版经典游戏之扫雷游戏完整示例【附demo源码下载】
2016/12/12 Javascript
微信小程序仿RadioGroup改变样式的处理方案
2018/07/13 Javascript
Vue2.0 实现歌手列表滚动及右侧快速入口功能
2018/08/08 Javascript
微信小程序实现身份证取景框拍摄
2020/09/09 Javascript
[02:01]BBC DOTA2国际邀请赛每日综述:八强胜者组鏖战,中国队喜忧参半
2014/07/19 DOTA
[01:46]2020完美世界全国高校联赛秋季赛报名开启
2020/10/15 DOTA
简单的Python2.7编程初学经验总结
2015/04/01 Python
python协程用法实例分析
2015/06/04 Python
python+Django+apache的配置方法详解
2016/06/01 Python
python八大排序算法速度实例对比
2017/12/06 Python
Python多线程中阻塞(join)与锁(Lock)使用误区解析
2018/04/27 Python
matplotlib.pyplot画图 图片的二进制流的获取方法
2018/05/24 Python
python pandas修改列属性的方法详解
2018/06/09 Python
Python爬虫包BeautifulSoup学习实例(五)
2018/06/17 Python
Python交互环境下实现输入代码
2018/06/22 Python
Python基于matplotlib画箱体图检验异常值操作示例【附xls数据文件下载】
2019/01/07 Python
HTML5实现的震撼3D焦点图动画的示例代码
2019/09/26 HTML / CSS
AmazeUI中模态框的实现
2020/08/19 HTML / CSS
菲律宾领先的在线时尚商店:Zalora菲律宾
2018/02/08 全球购物
写好求职信第一句话的技巧
2013/10/26 职场文书
自我评价的写作规则
2014/01/06 职场文书
双创工作实施方案
2014/03/26 职场文书
差生评语大全
2014/05/04 职场文书
尊师重教演讲稿
2014/09/04 职场文书
2014年人民调解工作总结
2014/12/08 职场文书
幼儿园教师师德承诺书
2015/04/28 职场文书
导游词之山东八大关
2019/12/18 职场文书