[PHP]session回收机制及php.ini session生命期
由于PHP的工作机制,它并没有一个daemon线程,来定时地扫描session信息并判断其是否失效。当一个有效请求发生时,PHP会根据全局变量 session.gc_probability/session.gc_divisor(同样可以通过php.ini或者ini_set()函数来修改) 的值,来决定是否启动一个GC(Garbage Collector)。默认情况下,session.gc_probability = 1,session.gc_divisor =100,也就是说有1%的可能性会启动GC。
GC的工作,就是扫描所有的session信息, 用当前时间减去session的最后修改时间(modified
date),同session.gc_maxlifetime参数进行比较,如果生存时间已经超过gc_maxlifetime,就把该session删
除。
那为什么会发生gc_maxlifetime无效的情况呢?
在默认情况下,session信息会以文本文件的形式,被保存在系统
的临时文件目录中。在Linux下,这一路径通常为\tmp,在Windows下通常为C:\Windows\Temp。当服务器上有多个PHP应用时,
它们会把自己的session文件都保存在同一个目录中。同样地,这些PHP应用也会按一定机率启动GC,扫描所有的session文件。
问 题在于,GC在工作时,并不会区分不同站点的session。举例言之,站点A的gc_maxlifetime设置为2小时,站点B的
gc_maxlifetime设置为默认的24分钟。当站点B的GC启动时,它会扫描公用的临时文件目录,把所有超过24分钟的session文件全部删
除掉,而不管它们来自于站点A或B。这样,站点A的gc_maxlifetime设置就形同虚设了。
找到问题所在,解决起来就很简单了。修改session.save_path参数,或者使用session_save_path()函数,把保存session的目录指向一个专用的目录,gc_maxlifetime参数工作正常了。
还有一个问题就是,gc_maxlifetime只能保证session生存的最短时间,并不能够保存在超过这一时间之后session信息立即
会得到
删除。因为GC是按机率启动的,可能在某一个长时间内都没有被启动,那么大量的session在超过gc_maxlifetime以后仍然会有效。解决这
个问题的一个方法是,把session.gc_probability/session.gc_divisor的机率提高,如果提到100%,就会彻底解
决这个问题,但显然会对性能造成严重的影响。另一个方法是自己在代码中判断当前session的生存时间,如果超出了gc_maxlifetime,就清
空当前session。
Tiwer
在window下設置wamp的session時間,即使設置了10秒超時,到時間都不會清空session。
linux的設置:
在apache1.2以上的版本中,可以在httpd.conf里面设置:
KeepAlive on
KeepAliveTimeout 15
session.auto_start 开启就自动完成了session_start()
php.ini 中 session.auto_start 开启与关闭的区别
区别就在于在用SESSION前是否需要session_start();
当session.auto_start = on
时,执行 session_start() 将产生新的 session_id
session.auto_start = on 的优点在于,任何时候都不会因忘记执行 session_start() 或 session_start() 在程序里的位置不对,而导致错误
缺点在于,如果你使用的是第三方代码,则必须删去其中的全部 session_start() 。否则将不能得到正确的结果
[PHP]session回收机制及php.ini session生命期的更多相关文章
- 跟着百度学PHP[15]-session回收机制
gc(Garbage Collection 垃圾回收) 在用户访问的时候会生成许多的临时session文件,顾名思义session回收机制就是用来删除这些临时文件的. session.gc_maxli ...
- PHP session回收机制
由于PHP的工作机制,它并没有一个daemon线程,来定时地扫描session信息并判断其是否失效.当一个有效请求发生时,PHP会根据全局变量 session.gc_probability/sessi ...
- PHP session回收机制(转)
由于PHP的工作机制,它并没有一个daemon线程,来定时地扫描session信息并判断其是否失效.当一个有效请求发生时,PHP会根据全局变量 session.gc_probability/sessi ...
- JVM与垃圾回收机制(GC)和类的生命周期
JVM运行时数据区 GC(垃圾回收机制) 什么是垃圾回收机制: 在系统运行过程中,会产生一些无用的对象,这些对象占据着一定的内存,如果不对这些对象清理回收无用的是对象,可能会导致内存的耗尽,所以垃圾回 ...
- JavaScript巩固篇(一)——数据类型与全局变量、局部变量、垃圾回收机制、存储方式、生命周期
知识要点 数据类型 存储方式 全局变量与局部变量 变量的生命周期 垃圾回收机制 知识概览 数据类型 JavaScript的数据类型分为:基本类型.引用类型 本质区别: 基本数据类型的变量实际值存储在栈 ...
- php中session的生成机制、回收机制和存储机制探究
1.php中session的生成机制 我们先来分析一下PHP中是怎么生成一个session的.设计出session的目的是保持每一个用户的各种状态来弥补HTTP协议的不足(无状态).我们现在有一个疑问 ...
- session垃圾回收机制
主要有以下三个参数 session.gc_maxlifetime:session生命周期 session.gc-devisor:启动session回收机制频率的被除数(分母) session.gc_p ...
- PHP session过期机制和配置
问题:使用PHP session时会遇到明明超过了session过期时间,但session依然完好无损的活着,让人头大. 其实仔细看一下php.ini关于PHP session回收机制就一目了然了. ...
- php中session实现机制
一.默认机制,用磁盘文件来实现PHP会话.php.ini配置:session.save_handler = files 1.session_start() A. session_start()是ses ...
随机推荐
- sqlserver2012 offset分页
select ID,UserName from user order by ID OFFSET (10 * (50-1)) ROW FETCH NEXT 10 rows only
- C#生成Guid,SqlServer生成Guid
https://www.cnblogs.com/che109/p/6808143.html工作中需要用到全球唯一标识符,在.net当中 微软已经为我们添加了此方法,我们只需要直接调用即可.代码如下: ...
- C++中extern(转)
1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.此外extern也可用来进行链接指定. 也就是说extern ...
- steps/train_lda_mllt.sh
LDA+MLLT指的是在计算MFCC后对特征进行的变换:首先对特征进行扩帧,使用LDA降维(默认降低到40),然后经过多次迭代轮数估计一个对角变换(又称为MLLT或CTC) .详见 http://ka ...
- css3动画transition animation
CSS动画简介 transition animation transition过渡:css3通过transitions属性引入时间概念,通过开始.结束状态自动计算中间状态,实现状态改变的过渡效果 ...
- icon图标制作网站推荐
推荐链接 easyicon
- ionic编译安卓App
安装node.js 安装Android Studio 运行Android Studio安装SDK,在D:\AndroidSDK 配置SDK环境 ANDROID_HOME=D:\AndroidSDK P ...
- python,random随机数的获取
随机数生成 首先我们需要在程序中引入random>>>import random as r r.random()用于生成一个随机的浮点数, >>> print(r. ...
- python,<一>读取文件open()
在实际操作中,我们经常会读取文件,这个时候python为我们提供了一个open()的方法,供我们读取文件,通过help(open),我们可以获取open的方法 f.close()关闭读取 f.read ...
- nginx基础命令
1.nginx 启动nginx service nginx start 查看nginx状态 service nginx status 关闭nginx service nginx stop 热重启(前提 ...