昨天下午纠结,想做一个10秒就自动清除的会话。

虽然后来采用了session+timestamp的方法,但是gc的回收机制却困扰了我。

根据说明,session的gc是根据以下三个参数。

session_start()是session机制的开始,它有一定概率开启垃圾回收

'session.gc_maxlifetime:'. ini_get('session.gc_maxlifetime')."
";

'session.gc_probability:'. ini_get('session.gc_probability')."
";

'session.gc_divisor:'. ini_get('session.gc_divisor')."
";

于是我把maxlifetime设置为10,probability 和divisor同时设置为1.

天真的以为10秒后会自动删除。

(注:win下phpstudy环境)

首先自定义关于php session的三个简单文件

read.php 读

write 写

gc 回收

1、写入session

session_start();

$_SESSION['nowtime']=date('Y-m-d H:i:s',time());

echo 'session.gc_maxlifetime:'. ini_get('session.gc_maxlifetime')."
";

echo 'session.gc_probability:'. ini_get('session.gc_probability')."
";

echo 'session.gc_divisor:'. ini_get('session.gc_divisor')."
";

echo 'session-id:'.session_id()."
";

echo 'session-name:'.session_name()."
";

echo '


';

echo 'write success in '.date('Y-m-d H:i:s',time());

session_write_close();

2、读取session和cookie

session_start();

echo 'session.gc_maxlifetime:'. ini_get('session.gc_maxlifetime')."
";

echo 'session.gc_probability:'. ini_get('session.gc_probability')."
";

echo 'session.gc_divisor:'. ini_get('session.gc_divisor')."
";

echo '


'.'Session::=>';

var_dump($_SESSION);

echo '


'.'Cookie::=>';

var_dump($_COOKIE);

echo '


';

echo "
ReadTime".date('Y-m-d H:i:s',time());

3、触发session_start ,(按照官方说必须触发start才能开始gc回收)

session_start();

session_write_close();

echo 'session_start execute ';

var_dump($_SESSION);

那么问题来了,用浏览器1一次访问 write,read,gc,然后10秒中之后,再次访问read。那个sessionid还是在那里一动不动。

后来换了本机其他浏览器(浏览器2),原来的sessionid就被清除掉了

。但是有个问题,即使我把回收站直接删除,在用浏览器1访问,sessionid的名字仍然是删除的那个。不知道他把这个sessionid到底存放在哪里。这些貌似不是大问题,因为一般网站触发其他的请求后,那么gc回收就起效了。

但是这种放在文件中存储session,如果遇到百万或者千万访问,gc要开启100%,他会依次比较当前时间减去mtime的差额,然后与maxlifetime设置的时间做对比。这样内存开销还是很大的。

so,那我们只能借助session_set_save_handler() 函数来设置自定义会话保存管理器。

大概流程是这样:

open:会话开始,调用open管理器

read:读取已经编码过的字符串

write:解码字符串,产生数组对象,放在$_SESSION全局数组变量,然后将session_id 一 起返回,调用close。

destory:会话结束时调用

此外,PHP 会不时地调用 gc 回调函数。 该函数会从持久化存储中删除超时的会话数据。

就是设置的maxlifetime值。

php session 回收,关于php session gc回收的问题相关推荐

  1. 【Java 虚拟机原理】垃圾回收算法 ( 可达性分析算法 | GC Root 示例 | GC 回收前的两次标记 | finalize 方法示例 )

    文章目录 一.可达性分析算法 二.GC Root 示例 三.GC 回收前的两次标记 四.finalize 方法示例 一.可达性分析算法 在 堆内存 中 , 存在一个 根对象 GC Root , GC ...

  2. java gc会回收类么_Java GC 垃圾回收机制

    一.Java GC是什么? Java垃圾回收是对JVM(Java Virtual Machine)中的内存进行标记,并确定哪些内存需要回收,根据一定的回收策略,自动的回收内存,永不停息(Nerver ...

  3. JVM堆GC回收次数

    GC回收次数 减少GC次数,可以提高性能 GC占用系统资源 减少系统资源的占用,可以提高系统性能 GC停顿现象 减少应用程序停顿,可以提高系统性能 当非常空间不足的时候,会进行GC回收 当内存空间充足 ...

  4. 53.垃圾回收算法的实现原理、启动Java垃圾回收、Java垃圾回收过程、垃圾回收中实例的终结、对象什么时候符合垃圾回收的条件、GC Scope 示例程序、GC OutOfMemoryError的示例

    53.垃圾回收算法的实现原理 53.1.目录 53.2.启动Java垃圾回收 53.3.Java垃圾回收过程 53.4.垃圾回收中实例的终结 53.5.对象什么时候符合垃圾回收的条件? 53.5.1. ...

  5. GC回收垃圾对象过程

    GC回收垃圾对象需要完成的三件事 1.哪些内存需要回收? 2.如何判断对象是否该回收? 3.如何回收垃圾对象? 哪些内存需要回收 程序计数器.虚拟机栈.本地方法栈三个区域随线程而生随线程而灭.虚拟机栈 ...

  6. Dalivik垃圾回收收机制Cocurrent GC简介

    在C/C++中,开发者需要手动地管理在堆中分配的内存,但是这往往导致很多问题. 1. 内存分配之后忘记释放,造成内存泄漏. 2. 非法访问那些已经释放了的内存,引发程序崩溃. 没有一个好的C/C++应 ...

  7. java gc回收区域_java内存区域以及GC回收

    参考资料: http://www.cnblogs.com/zhguang/p/3257367.html 概要: Java GC机制主要完成3件事:确定哪些内存需要回收,确定什么时候需要执行GC,如何执 ...

  8. Javafx的WebEngine的url加载不输出结果坑,gc回收了局部变量

    一.坑场景复现 源于w3cschool的JavaFX WebEngine测试例子,运行代码都没有输出,一直在研究为什么会出现这样的结果. 在测试过程中使用WebEngine的html加载,使用WebE ...

  9. .net 把一个对象赋值给一个参数_Java GC回收算法-判定一个对象是否可以回收

    开源推荐 推荐一款一站式性能监控工具(开源项目) Pepper-Metrics是跟一位同事一起开发的开源组件,主要功能是通过比较轻量的方式与常用开源组件(jedis/mybatis/motan/dub ...

最新文章

  1. 在Oracle中IMP导入数据时,如何解决目标数据库字符不一致问题
  2. 微软公布19财年财报:净利润增长22%,云计算首超个人计算业务
  3. 树莓派进阶之路 (019) - 树莓派通过filezilla,samba与PC文件共享(转)
  4. Java黑皮书课后题第6章:*6.23(指定字符的出现次数)使用下面的方法头编写一个方法,找到一个字符串中指定字符的出现次数。编写一个测试程序,提示用户输入一个字符串以及一个字符,显示该字符出现次数
  5. Azure DevOps+Docker+Asp.NET Core 实现CI/CD(一 .简介与创建自己的代理池)
  6. ibm服务器芯片架构,IBM x366 服务器技术详解
  7. Verilog HDL中容易生成锁存器的两种情况
  8. id和instancetype的区别
  9. Dos命令使用Latex编写“Hello Latex.”
  10. Leetcode算法题(C语言)6--只出现一次的数字
  11. archLinux 安装拼音输入法
  12. 11(3)-AirSim+四旋翼仿真-AirSim中人工势场法方法改进
  13. ASP.net校友录毕业设计(源代码+论文+开题报告+答辩PPT)ASP.NET小型证券术语解释及翻译系统的设计与开发(源代码+论文)
  14. 三明市机器人协会_☞ 智能之花 绚丽绽放——2019年三明市区首届青少年机器人竞赛活动在三明市陈景润实验小学完美收官...
  15. BJTU1935 铁憨憨骑士团的购买装备
  16. LOJ2312 LUOGU-P3733「HAOI2017」八纵八横 (异或线性基、生成树、线段树分治)
  17. 新物种爆炸:认知升级时代的新商业思维
  18. 多个圆通快递单号的物流信息如何在电脑上批量查询?
  19. IDEA连接数据库自动生成model(get set方法)
  20. 关于学校edu邮箱登录第三方邮件客户端(例如Outlook、Foxmail、QQ邮箱、邮件App等)的注意事项

热门文章

  1. python localtime 与utc时间差5分钟_在linux中用localtime()显示的时间与实际时间不相符,不是与北京时间差8个小时,而是差15个小时...
  2. ARM 之九 Cortex-M/R 内核启动过程 / 程序启动流程(基于ARMCC、Keil)
  3. 算法练习day14——190402(贪心:切金条、做项目、会议室安排)
  4. springboot后台怎么获取前端传过来的excel_开源商城系统包含后台管理和手机端
  5. 山东管理学院计算机专业在哪个校区,2019年山东管理学院新生在哪个校区及新生开学报到时间...
  6. 百度 Serverless 架构揭秘与应用实践
  7. python实现排序算法_python实现·十大排序算法之插入排序(Insertion Sort)
  8. mysql 报错1045 - Access denied for user “root” @ 192.111.111.11 (using password: YES)
  9. e语言html显示框,html marguee标签
  10. python实现b树_B树及2-3树的python实现