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 相关文章推荐
cache_lite试用
Feb 14 PHP
php error_log 函数的使用
Apr 13 PHP
PHP 常用数组内部函数(Array Functions)介绍
Jun 05 PHP
PHP管理依赖(dependency)关系工具 Composer 安装与使用
Aug 18 PHP
php操作(删除,提取,增加)zip文件方法详解
Mar 12 PHP
codeigniter中view通过循环显示数组数据的方法
Mar 20 PHP
PHP数组函数知识汇总
May 12 PHP
PHP下的浮点运算不准的解决方法
Oct 27 PHP
php 自定义错误日志实例详解
Nov 12 PHP
PHP实现的最大正向匹配算法示例
Dec 19 PHP
php实现算术验证码功能
Dec 05 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
Feb 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
咖啡历史、消费和行业趋势
2021/03/03 咖啡文化
PHP音乐采集(部分代码)
2007/02/14 PHP
smarty section简介与用法分析
2008/10/03 PHP
PHPCMS的使用小结
2010/09/20 PHP
php数组函数序列之array_values() 获取数组元素值的函数与方法
2011/10/30 PHP
php将字符串转换成16进制的方法
2015/03/17 PHP
php格式文件打开的四种方法
2018/02/24 PHP
Laravel框架基于ajax和layer.js实现无刷新删除功能示例
2019/01/17 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
2020/04/04 PHP
escape编码与unescape解码汉字出现乱码的解决方法
2014/07/02 Javascript
JavaScript使用replace函数替换字符串的方法
2015/04/06 Javascript
JavaScript实现的简单拖拽效果
2015/06/01 Javascript
简述AngularJS的控制器的使用
2015/06/16 Javascript
JavaScript中的return语句简单介绍
2015/12/07 Javascript
详解Bootstrap插件
2016/04/25 Javascript
jQuery实现鼠标滚动图片延迟加载效果附源码下载
2016/06/28 Javascript
鼠标拖动改变DIV等网页元素的大小的实现方法
2017/07/06 Javascript
jQuery基于Ajax实现读取XML数据功能示例
2018/05/31 jQuery
详解ES6 Symbol 的用途
2018/10/14 Javascript
详解angular2 控制视图的封装模式
2018/12/27 Javascript
Vue项目中使用better-scroll实现菜单映射功能方法
2019/09/11 Javascript
解决vue动态下拉菜单 有数据未反应的问题
2020/08/06 Javascript
python使用cookie库操保存cookie详解
2014/03/03 Python
Python获取邮件地址的方法
2015/07/10 Python
python实现井字棋游戏
2020/03/30 Python
详解Python开发中如何使用Hook技巧
2017/11/01 Python
python 2.7 检测一个网页是否能正常访问的方法
2018/12/26 Python
python实现网页自动签到功能
2019/01/21 Python
Numpy之random函数使用学习
2019/01/29 Python
python实现中文文本分句的例子
2019/07/15 Python
canvas里面如何基于随机点绘制一个多边形的方法
2018/06/13 HTML / CSS
STP协议的主要用途是什么?为什么要用STP
2012/12/20 面试题
高三上学期学习自我评价
2014/04/23 职场文书
房地产销售主管岗位职责
2015/02/13 职场文书
2015年教育实习工作总结
2015/04/24 职场文书
写给医护人员的一封感谢信
2019/09/16 职场文书