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手册及PHP编程标准
Dec 17 PHP
ajax php 实现写入数据库
Sep 02 PHP
php的memcache类分享(memcache队列)
Mar 26 PHP
php采用file_get_contents代替使用curl实例
Nov 07 PHP
php的sso单点登录实现方法
Jan 08 PHP
php实现求相对时间函数
Jun 15 PHP
WordPress中登陆后关闭登陆页面及设置用户不可见栏目
Dec 31 PHP
PHP清除缓存的几种方法总结
Sep 12 PHP
php实现的中秋博饼游戏之掷骰子并输出结果功能详解
Nov 06 PHP
PHP字符串中抽取子串操作实例分析
Jun 22 PHP
tp5框架前台无限极导航菜单类实现方法分析
Mar 29 PHP
php慢查询日志和错误日志使用详解
Feb 27 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
将博客园(cnblogs.com)数据导入到wordpress的代码
2013/01/06 PHP
基础的WordPress插件制作教程
2015/11/24 PHP
jQuery 全选效果实现代码
2009/03/23 Javascript
javascript中运用闭包和自执行函数解决大量的全局变量问题
2010/12/30 Javascript
jquery仿QQ商城带左右按钮控制焦点图片切换滚动效果
2013/06/27 Javascript
js中array的sort()方法使用介绍
2014/02/20 Javascript
JavaScript编程中布尔对象的基本使用
2015/10/25 Javascript
简单实现限制uploadify上传个数
2015/11/16 Javascript
第五篇Bootstrap 排版
2016/06/21 Javascript
BootStrap 弹出层代码
2017/02/09 Javascript
JavaScript通过改变文字透明度实现的文字闪烁效果实例
2017/04/27 Javascript
浅谈JS 数字和字符串之间相互转化的纠纷
2017/10/20 Javascript
cordova+vue+webapp使用html5获取地理位置的方法
2019/07/06 Javascript
Vue发布项目实例讲解
2019/07/17 Javascript
小程序实现上下移动切换位置
2019/09/23 Javascript
使用Python构建Hopfield网络的教程
2015/04/14 Python
Python 多线程实例详解
2017/03/25 Python
Python查找第n个子串的技巧分享
2018/06/27 Python
Python使用itertools模块实现排列组合功能示例
2018/07/02 Python
python中for循环输出列表索引与对应的值方法
2018/11/07 Python
Django框架验证码用法实例分析
2019/05/10 Python
python通过matplotlib生成复合饼图
2020/02/06 Python
Django 项目布局方法(值得推荐)
2020/03/22 Python
Python基于模块Paramiko实现SSHv2协议
2020/04/28 Python
HTML5 播放 RTSP 视频的实例代码
2019/07/29 HTML / CSS
建筑系毕业生自我鉴定
2014/01/24 职场文书
环境保护标语
2014/06/20 职场文书
文秘班元旦晚会活动策划方案
2014/08/28 职场文书
2014光棍节大学生联谊活动方案
2014/10/10 职场文书
2014年网络管理员工作总结
2014/12/01 职场文书
入党现实表现材料
2014/12/23 职场文书
python基础之停用词过滤详解
2021/04/21 Python
Python中super().__init__()测试以及理解
2021/12/06 Python
python_tkinter事件类型详情
2022/03/20 Python
对象析构函数__del__在Python中何时使用
2022/03/22 Python
windows10 家庭版下FTP服务器搭建教程
2022/08/05 Servers