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 相关文章推荐
PHP5.2下chunk_split()函数整数溢出漏洞 分析
Jun 06 PHP
php Memcache 中实现消息队列
Nov 24 PHP
php无限分类且支持输出树状图的详细介绍
Jun 19 PHP
解析php根据ip查询所在地区(非常有用,赶集网就用到)
Jul 01 PHP
jQuery Mobile + PHP实现文件上传
Dec 12 PHP
PHP数组与对象之间使用递归实现转换的方法
Jun 24 PHP
php商品对比功能代码分享
Sep 24 PHP
php防止CC攻击代码 php防止网页频繁刷新
Dec 21 PHP
PHP带节点操作的无限分类实现方法详解
Nov 09 PHP
php 人员权限管理(RBAC)实例(推荐)
May 24 PHP
PHP实现的下载远程文件类定义与用法示例
Jul 05 PHP
php实现的中秋博饼游戏之绘制骰子图案功能示例
Nov 06 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获取目标函数执行时间示例
2014/03/04 PHP
PHP实现简单实用的分页类代码
2016/04/08 PHP
浅析php-fpm静态和动态执行方式的比较
2016/11/09 PHP
prototype Element学习笔记(篇一)
2008/10/26 Javascript
Knockoutjs的环境搭建教程
2012/11/26 Javascript
js中文逗号转英文实现
2014/02/11 Javascript
jscript读写二进制文件的方法
2015/04/22 Javascript
jQuery实现自动调用和触发某个事件的方法
2016/11/18 Javascript
React实现点击删除列表中对应项
2017/01/10 Javascript
微信小程序中form 表单提交和取值实例详解
2017/04/20 Javascript
基于vue-cli创建的项目的目录结构及说明介绍
2017/11/23 Javascript
iview通过Dropdown(下拉菜单)实现的右键菜单
2018/10/26 Javascript
详解微信小程序调用支付接口支付
2019/04/28 Javascript
JavaScript+HTML5 canvas实现放大镜效果完整示例
2019/05/15 Javascript
微信小程序实现日期格式化和倒计时
2020/11/01 Javascript
VUE前后端学习tab写法实例
2019/08/06 Javascript
零基础写python爬虫之urllib2中的两个重要概念:Openers和Handlers
2014/11/05 Python
python打开url并按指定块读取网页内容的方法
2015/04/29 Python
bpython 功能强大的Python shell
2016/02/16 Python
Django自定义分页效果
2017/06/27 Python
使用paramiko远程执行命令、下发文件的实例
2017/10/01 Python
Python使用xlwt模块操作Excel的方法详解
2018/03/27 Python
django ajax json的实例代码
2018/05/29 Python
Windows下python3.7安装教程
2018/07/31 Python
python内置数据类型之列表操作
2018/11/12 Python
解决Python设置函数调用超时,进程卡住的问题
2019/08/08 Python
PyCharm 2020 激活到 2100 年的教程
2020/03/25 Python
Python代码执行时间测量模块timeit用法解析
2020/07/01 Python
python利用递归方法实现求集合的幂集
2020/09/07 Python
传统HTML页面实现模块化加载的方法
2018/10/15 HTML / CSS
雷蛇美国官网:Razer
2020/04/03 全球购物
幼儿园中秋节活动方案2013
2014/01/29 职场文书
上班迟到检讨书
2015/05/06 职场文书
2015年网络管理员工作总结
2015/05/21 职场文书
运动会宣传语
2015/07/13 职场文书
Redis基本数据类型List常用操作命令
2022/06/01 Redis