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防注入代码
Apr 07 PHP
PHP 第二节 数据类型之数值型
Apr 28 PHP
PHPMailer邮件发送的实现代码
May 04 PHP
php中filter_input函数用法分析
Nov 15 PHP
详解PHP中的Traits
Jul 29 PHP
PHP+Mysql+jQuery实现发布微博程序 php篇
Oct 15 PHP
PHP随手笔记整理之PHP脚本和JAVA连接mysql数据库
Nov 25 PHP
thinkPHP3.1验证码的简单实现方法
Apr 22 PHP
php实现头像上传预览功能
Apr 27 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
Feb 10 PHP
PHP赋值的内部是如何跑的详解
Jan 13 PHP
PHP 实现base64编码文件上传出现问题详解
Sep 01 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 5.3 下载时 VC9、VC6、Thread Safe、Non Thread Safe的区别分析
2011/03/28 PHP
基于PHP实现假装商品限时抢购繁忙的效果
2015/10/16 PHP
Javascript中的Split使用方法与技巧
2007/03/09 Javascript
JavaScript 笔记二 Array和Date对象方法
2010/05/22 Javascript
js单例模式详解实例
2013/11/21 Javascript
JS按回车键实现登录的方法
2014/08/25 Javascript
使用javascript实现Iframe自适应高度
2014/12/24 Javascript
百度UEditor编辑器如何关闭抓取远程图片功能
2015/03/03 Javascript
JS+CSS实现美化的下拉列表框效果
2015/08/11 Javascript
angularjs学习笔记之三大模块(modal,controller,view)
2015/09/26 Javascript
jQuery 翻页组件yunm.pager.js实现div局部刷新的思路
2016/08/11 Javascript
ionic cordova一次上传多张图片(类似input file提交表单)的实现方法
2016/12/16 Javascript
AngularJS常见过滤器用法实例总结
2017/07/06 Javascript
JQ图片文件上传之前预览功能的简单实例(分享)
2017/11/12 Javascript
[13:55]Newbee vs Team Spirit
2018/06/07 DOTA
Python pickle模块用法实例分析
2015/05/27 Python
Python实现定时任务
2017/02/08 Python
python面向对象_详谈类的继承与方法的重载
2017/06/07 Python
Python输入二维数组方法
2018/04/13 Python
python编写暴力破解zip文档程序的实例讲解
2018/04/24 Python
python按键按住不放持续响应的实例代码
2019/07/17 Python
Django基础三之视图函数的使用方法
2019/07/18 Python
解决安装新版PyQt5、PyQT5-tool后打不开并Designer.exe提示no Qt platform plugin的问题
2020/04/24 Python
在python image 中实现安装中文字体
2020/05/16 Python
jupyter notebook 写代码自动补全的实现
2020/11/02 Python
html5播放视频且动态截图实现步骤与代码(支持safari其他未测试)
2013/01/06 HTML / CSS
技校教师求职简历的自我评价
2013/10/20 职场文书
中专毕业生的自我鉴定
2013/12/01 职场文书
主要领导对照检查材料
2014/08/26 职场文书
加薪通知
2015/04/25 职场文书
迎新生欢迎词2015
2015/07/16 职场文书
2015年城管执法工作总结
2015/07/23 职场文书
2019暑假学生安全口号
2019/06/27 职场文书
Angular性能优化之第三方组件和懒加载技术
2021/05/10 Javascript
Python入门学习之类的相关知识总结
2021/05/25 Python
VUE中的v-if与v-show区别介绍
2022/03/13 Vue.js