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 cache类代码(php数据缓存类)
Apr 15 PHP
PHP定时执行计划任务的多种方法小结
Dec 19 PHP
smarty缓存用法分析
Dec 16 PHP
详解WordPress中调用评论模板和循环输出评论的PHP函数
Jan 05 PHP
Symfony2框架学习笔记之表单用法详解
Mar 18 PHP
PHP微信开发之文本自动回复
Jun 23 PHP
PHP从二维数组得到N层分类树的实现代码
Oct 11 PHP
PHP实现电商订单自动确认收货redis队列
May 17 PHP
PHP获取数组中单列值的方法
Jun 10 PHP
php+Ajax处理xml与json格式数据的方法示例
Mar 04 PHP
Laravel配置全局公共函数的方法步骤
May 09 PHP
PHP接口类(interface)的定义、特点和应用示例
May 18 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执行速度全攻略(下)
2006/10/09 PHP
jQuery+php简单实现全选删除的方法
2016/11/28 PHP
php PDO实现的事务回滚示例
2017/03/23 PHP
IE6,IE7下js动态加载图片不显示错误
2010/07/17 Javascript
Ext JS 4实现带week(星期)的日期选择控件(实战一)
2013/08/21 Javascript
js实现checkbox全选和反选示例
2014/05/01 Javascript
莱鸟介绍javascript onclick事件
2016/01/06 Javascript
Javascript的表单验证-初识正则表达式
2016/03/18 Javascript
CascadeView级联组件实现思路详解(分离思想和单链表)
2016/04/12 Javascript
vue 运用mock数据的示例代码
2017/11/07 Javascript
vue cli2.0单页面title修改方法
2018/06/07 Javascript
vue-cli 2.*中导入公共less文件的方法步骤
2018/11/22 Javascript
vue 使用高德地图vue-amap组件过程解析
2019/09/07 Javascript
node.js使用stream模块实现自定义流示例
2020/02/13 Javascript
Quasar Input:type="number" 去掉上下小箭头 实现加减按钮样式功能
2020/04/09 Javascript
video.js添加自定义组件的方法
2020/12/09 Javascript
python连接mysql实例分享
2016/10/09 Python
Python端口扫描简单程序
2016/11/10 Python
解决python3 urllib中urlopen报错的问题
2017/03/25 Python
Python HTTP客户端自定义Cookie实现实例
2017/04/28 Python
python计算两个数的百分比方法
2018/06/29 Python
详解pandas使用drop_duplicates去除DataFrame重复项参数
2019/08/01 Python
Python3.7安装keras和TensorFlow的教程图解
2020/06/18 Python
详解Python爬虫爬取博客园问题列表所有的问题
2021/01/18 Python
经济实惠的豪华背包和行李袋:Packs Project
2018/10/17 全球购物
Flesh Beauty官网:露华浓集团旗下彩妆品牌
2021/02/15 全球购物
一道写SQL的面试题和答案
2013/11/19 面试题
教师自荐书
2013/10/08 职场文书
给老婆的搞笑检讨书
2014/01/12 职场文书
聘用意向书范本
2014/04/01 职场文书
干部作风建设心得体会
2014/10/22 职场文书
信访稳定工作汇报
2014/10/27 职场文书
学子宴致辞大全
2015/07/27 职场文书
小学生运动会广播
2015/08/19 职场文书
事业单位工作人员2015年度思想工作总结
2015/10/15 职场文书
聊聊基于pytorch实现Resnet对本地数据集的训练问题
2022/03/25 Python