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 相关文章推荐
3
Oct 09 PHP
php ss7.5的数据调用 (笔记)
Mar 08 PHP
深入理解PHP几个算法:PHP冒泡、PHP二分法、PHP求素数、PHP乘法表
Jun 06 PHP
php实现可以设置中奖概率的抽奖程序代码分享
Jan 19 PHP
ThinkPHP3.1新特性之多数据库操作更加完善
Jun 19 PHP
ThinkPHP上使用多说评论插件的方法
Oct 31 PHP
php+ajax实时输入自动搜索匹配的方法
Dec 26 PHP
PHP中的命名空间详细介绍
Jul 02 PHP
php实现mysql数据库连接操作及用户管理
Nov 08 PHP
PHP观察者模式示例【Laravel框架中有用到】
Jun 15 PHP
PHP实现的AES 128位加密算法示例
Sep 16 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
玩家交还《星际争霸》原始码光盘 暴雪报以厚礼
2017/05/05 星际争霸
php判断变量类型常用方法
2012/04/24 PHP
Yii2框架使用计划任务的方法
2016/05/25 PHP
Yii2下点击验证码的切换实例代码
2017/03/14 PHP
PHP设计模式之工厂模式实例总结
2017/09/01 PHP
基于laravel缓冲cache的用法详解
2019/10/23 PHP
PHP pthreads v3下同步处理synchronized用法示例
2020/02/21 PHP
脚本之家贴图转换+转贴工具用到的js代码超级推荐
2007/04/05 Javascript
获取当前网页document.url location.href区别总结
2008/05/10 Javascript
基于JQuery的一句话搞定手风琴菜单
2012/09/14 Javascript
JavaScript中实现sprintf、printf函数
2015/01/27 Javascript
jQuery+AJAX实现无刷新下拉加载更多
2015/07/03 Javascript
简单对比分析JavaScript中的apply,call与this的使用
2015/12/04 Javascript
在weex中愉快的使用scss的方法步骤
2020/01/02 Javascript
vue如何在用户要关闭当前网页时弹出提示的实现
2020/05/31 Javascript
python处理图片之PIL模块简单使用方法
2015/05/11 Python
Python数据操作方法封装类实例
2017/06/23 Python
python+selenium开发环境搭建图文教程
2017/08/11 Python
python利用paramiko连接远程服务器执行命令的方法
2017/10/16 Python
django 简单实现登录验证给你
2019/11/06 Python
PyQt5中向单元格添加控件的方法示例
2020/03/24 Python
在jupyter notebook 添加 conda 环境的操作详解
2020/04/10 Python
python根据完整路径获得盘名/路径名/文件名/文件扩展名的方法
2020/04/22 Python
丝芙兰巴西官方商城:SEPHORA巴西
2016/10/31 全球购物
M.M.LaFleur官网:美国职业女装品牌
2020/10/27 全球购物
应届生法律求职信
2013/10/22 职场文书
培训心得体会
2013/12/29 职场文书
法人委托书
2014/07/31 职场文书
创先争优活动心得体会
2014/09/04 职场文书
爱心捐助活动总结
2015/05/09 职场文书
初三数学教学反思
2016/02/17 职场文书
八年级作文之我的母亲
2019/12/10 职场文书
Django+Celery实现定时任务的示例
2021/06/23 Python
《王者天下》第4季首话新剧照 4月9日正式开播
2022/04/07 日漫
MySQL数据库查询之多表查询总结
2022/08/05 MySQL
vue实现input输入模糊查询的三种方式
2022/08/14 Vue.js