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
Dec 13 PHP
笑谈配置,使用Smarty技术
Jan 04 PHP
ezSQL PHP数据库操作类库
May 16 PHP
那些年一起学习的PHP(二)
Mar 21 PHP
用PHP编写和读取XML的几种方式
Jan 12 PHP
配置eAccelerator和XCache扩展来加速PHP程序的执行
Dec 22 PHP
WordPress主题制作中自定义头部的相关PHP函数解析
Jan 08 PHP
Yii2 rbac权限控制之菜单menu实例教程
Apr 28 PHP
关于PHP通用返回值设置方法
Mar 31 PHP
php 中htmlentities导致中文无法查询问题
Sep 10 PHP
浅谈laravel-admin的sortable和orderby使用问题
Oct 03 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』PHP截断函数mb_substr()使用介绍
2013/04/22 PHP
探讨:使用XMLSerialize 序列化与反序列化
2013/06/08 PHP
通过PHP自带的服务器来查看正则匹配结果的方法
2015/12/24 PHP
PHP设置头信息及取得返回头信息的方法
2016/01/25 PHP
php从数据库中读取特定的行(实例)
2017/06/02 PHP
一段实时更新的时间代码
2006/07/07 Javascript
云网广告中的代码,提示出错,大家找找
2006/11/21 Javascript
又一个图片自动缩小的JS代码
2007/03/10 Javascript
javascript下高性能字符串连接StringBuffer类
2010/08/16 Javascript
jQuery新闻滚动插件 jquery.roller.js
2011/06/27 Javascript
Javascript异步编程的4种方法让你写出更出色的程序
2013/01/17 Javascript
js遍历、动态的添加数据的小例子
2013/06/22 Javascript
jQuery中的val()示例应用
2014/02/26 Javascript
快速掌握Node.js中setTimeout和setInterval的使用方法
2016/03/21 Javascript
jquery+ajax实现省市区三级联动效果简单示例
2017/01/04 Javascript
vue2 中二级路由高亮问题及配置方法
2019/06/10 Javascript
JavaScript跳出循环的三种方法(break, return, continue)
2019/07/30 Javascript
JS中的算法与数据结构之常见排序(Sort)算法详解
2019/08/16 Javascript
使用Python获取Linux系统的各种信息
2014/07/10 Python
python网络编程实例简析
2014/09/26 Python
Python入门篇之面向对象
2014/10/20 Python
Python文档生成工具pydoc使用介绍
2015/06/02 Python
Django基础知识与基本应用入门教程
2018/07/20 Python
python从子线程中获得返回值的方法
2019/01/30 Python
详解Python的循环结构知识点
2019/05/20 Python
利用Python模拟登录pastebin.com的实现方法
2019/07/12 Python
python并发编程多进程 互斥锁原理解析
2019/08/20 Python
浅谈pycharm使用及设置方法
2019/09/09 Python
PyTorch: Softmax多分类实战操作
2020/07/07 Python
python源文件的字符编码知识点详解
2021/03/04 Python
耐克亚太地区:Nike APAC
2019/12/07 全球购物
幼儿园的门卫岗位职责
2014/04/10 职场文书
投资建议书模板
2014/05/12 职场文书
致百米运动员广播稿5篇
2014/10/13 职场文书
如何写好一份优秀的工作总结?
2019/06/21 职场文书
redis连接被拒绝的解决方案
2021/04/12 Redis