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 相关文章推荐
第十三节--对象串行化
Nov 16 PHP
几个php应用技巧
Mar 27 PHP
php添加文章时生成静态HTML文章的实现代码
Feb 17 PHP
深入解析PHP内存管理之谁动了我的内存
Jun 20 PHP
PHP mkdir()无写权限的问题解决方法
Jun 19 PHP
PHP生成压缩文件实例
Feb 07 PHP
php计算整个目录大小的方法
Jun 19 PHP
php导出生成word的方法
Dec 25 PHP
抛弃 PHP 代价太高
Apr 26 PHP
php获取文件名称和扩展名的方法
Feb 07 PHP
PHP开发的微信现金红包功能示例
Jun 29 PHP
浅谈PHP发送HTTP请求的几种方式
Jul 25 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
漫荒推荐:画风超赞的国风漫画推荐 超长假期不无聊
2020/03/08 国漫
浅析linux下apache服务器的配置和管理
2013/08/10 PHP
php 魔术方法详解
2014/11/11 PHP
js 覆盖和重载 函数
2009/09/25 Javascript
jQuery EasyUI API 中文文档 - EasyLoader 加载器
2011/09/29 Javascript
JS删除字符串中重复字符方法
2014/03/09 Javascript
js 显示base64编码的二进制流网页图片
2014/04/04 Javascript
jQuery针对各类元素操作基础教程
2014/08/29 Javascript
js实现select跳转功能代码
2014/10/22 Javascript
Js控制滑轮左右滑动实例
2015/02/13 Javascript
在JavaScript中操作时间之getMonth()方法的使用
2015/06/10 Javascript
jQuery实现按钮只点击一次后就取消点击事件绑定的方法
2015/06/26 Javascript
微信小程序 网络请求(post请求,get请求)
2017/01/17 Javascript
ES6实现的遍历目录函数示例
2017/04/07 Javascript
Angular4如何自定义首屏的加载动画详解
2017/07/26 Javascript
利用Three.js如何实现阴影效果实例代码
2017/09/26 Javascript
JavaScript捕捉事件和阻止冒泡事件实例分析
2018/08/03 Javascript
解决vue 界面在苹果手机上滑动点击事件等卡顿问题
2018/11/27 Javascript
通过代码实例展示Python中列表生成式的用法
2015/03/31 Python
python结合API实现即时天气信息
2016/01/19 Python
python修改txt文件中的某一项方法
2018/12/29 Python
Python 列表去重去除空字符的例子
2019/07/20 Python
联想中国官方商城:Lenovo China
2017/10/18 全球购物
英国最受欢迎的母婴精品品牌:JoJo Maman BéBé
2021/02/17 全球购物
应届生护士求职信
2013/11/01 职场文书
《和我们一样享受春天》教学反思
2014/02/07 职场文书
教师个人鉴定材料
2014/02/08 职场文书
乡村教师党员四风问题对照检查材料思想汇报
2014/10/08 职场文书
2014年信息技术工作总结
2014/12/16 职场文书
酒店辞职书怎么写
2015/02/26 职场文书
党支部工作总结2015
2015/04/01 职场文书
党员转正介绍人意见
2015/06/03 职场文书
长江七号观后感
2015/06/11 职场文书
道士塔读书笔记
2015/06/30 职场文书
幼儿体育课教学反思
2016/02/16 职场文书
MySQL创建管理RANGE分区
2022/04/13 MySQL