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出错界面
Oct 09 PHP
让PHP支持页面回退的两种方法[转]
Feb 14 PHP
php学习之 循环结构实现代码
Jun 09 PHP
深入PHP许愿墙模块功能分析
Jun 25 PHP
php采集文章中的图片获取替换到本地(实现代码)
Jul 08 PHP
一漂亮的PHP图片验证码实例
Mar 21 PHP
php使用Cookie实现和用户会话的方法
Jan 21 PHP
Yii数据读取与跳转参数传递用法实例分析
Jul 12 PHP
php 算法之实现相对路径的实例
Oct 17 PHP
自写的利用PDO对mysql数据库增删改查操作类
Feb 19 PHP
Laravel Validator自定义错误返回提示消息并在前端展示
May 09 PHP
php引用和拷贝的区别知识点总结
Sep 23 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.5 创建和验证哈希最简单的方法详解
2013/11/07 PHP
[原创]php求圆周率的简单实现方法
2016/05/30 PHP
JavaScript 乱码问题
2009/08/06 Javascript
关于this和self的使用说明
2010/08/01 Javascript
jQuery的控件及事件(输入控件及回车事件)使用示例
2013/07/25 Javascript
jquery easyui滚动条部分设置介绍
2013/09/12 Javascript
jQuery中使用Ajax获取JSON格式数据示例代码
2013/11/26 Javascript
简单的ajax连接库分享(不用jquery的ajax)
2014/01/19 Javascript
TypeScript学习之强制类型的转换
2016/12/27 Javascript
vue-dialog的弹出层组件
2020/05/25 Javascript
JavaScript比较同一天的时间大小实例代码
2018/02/09 Javascript
bootstrapTable+ajax加载数据 refresh更新数据
2018/08/31 Javascript
vue-cli3.0 环境变量与模式配置方法
2018/11/08 Javascript
详解vue为什么要求组件模板只能有一个根元素
2019/07/22 Javascript
javascript中的with语句学习笔记及用法
2020/02/17 Javascript
微信小程序使用 vant Dialog组件的正确方式
2020/02/21 Javascript
js实现轮播图特效
2020/05/28 Javascript
python网络编程之UDP通信实例(含服务器端、客户端、UDP广播例子)
2014/04/25 Python
Python实现去除代码前行号的方法
2015/03/10 Python
Python判断值是否在list或set中的性能对比分析
2016/04/16 Python
Python-嵌套列表list的全面解析
2016/06/08 Python
Python中.join()和os.path.join()两个函数的用法详解
2018/06/11 Python
在Python中分别打印列表中的每一个元素方法
2018/11/07 Python
python使用paramiko模块通过ssh2协议对交换机进行配置的方法
2019/07/25 Python
python 求定积分和不定积分示例
2019/11/20 Python
纯CSS3实现带动画效果导航菜单无需js
2013/09/27 HTML / CSS
美国最好的钓鱼、狩猎和划船装备商店:Bass Pro Shops
2018/12/02 全球购物
PHP笔试题
2012/02/22 面试题
介绍一下Java中的static关键字
2012/05/12 面试题
导购员的岗位职责
2014/02/08 职场文书
人力资源部经理助理岗位职责
2014/03/04 职场文书
优质服务活动实施方案
2014/05/02 职场文书
个人授权委托书范本
2014/09/14 职场文书
八项规定自查自纠报告及整改措施
2014/10/26 职场文书
电影开国大典观后感
2015/06/04 职场文书
小学生优秀作文范文(六篇)
2019/07/10 职场文书