- 浏览: 390791 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (229)
- java编程 (4)
- java实用程序 (2)
- 算法设计 (34)
- 数据库 (8)
- ACM模板 (12)
- 技术术语 (1)
- java_web (3)
- php (22)
- eclipse (3)
- linux (25)
- linux命令使用心得 (3)
- web服务器 (8)
- IT知识 (2)
- 前端技术 (17)
- 开源软件 (5)
- vim (3)
- linux多线程 (9)
- web开发经验 (3)
- lua (5)
- linux编程 (3)
- smarty (1)
- mysql (4)
- Hive (2)
- 数据挖掘 (9)
- python (2)
- 生活 (1)
- C++ (2)
- 计算机 (1)
- objective-c (11)
- css (2)
- 游戏 (1)
- Mac (1)
最新评论
-
lr544463316:
我的怎么不行呀.....
Mysql Access denied for user ''@'localhost' to database 的一种解决方法 -
babaoqi:
使用时需要注意group_concat函数返回值的最大长度=g ...
mysql中的group_concat函数 -
代码能力弱成渣:
可以帮我看下我的代码么?我自己写的sam,也有ac过题的,但是 ...
求两个字符串的最长公共连续子序列(SAM实现) -
atgoingguoat:
有1000个?不过还是收藏下。
jquery常用的插件1000收集(转载)
转自: http://blog.csdn.net/21aspnet/article/details/7218923
由于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。
php session GC功能,就是Garbage Collector。这个GC启动的时候,会清除那些已经“超时”的session。它的工作原理是这样的:
- 用户访问并登陆网站,这时候后台会调用session_start来尝试生成一个会话(如果已经有会话,则相当于一次有效会话请求)
- 对于这样的每一次有效会话请求(Request),apache的php模块会根据session相关的全局变量gc_probability/gc_divisor =>计算出启动GC的概率,并由此概率来决定在这次请求中是否应该启动GC。举例来说,session.gc_probability的缺省值为1,session.gc_divisor的缺省值为100,则启动“垃圾回收”器的概率是1%,这就意味着在每100次请求中,会有可能清理一次过期会话
- 如果GC启动,则GC会扫描当前会话所在路径(session.save_path)下的所有会话文件,并根据另外一个全局变量session.gc_maxlifetime的多少来判断哪些session已经过期(“当前时间”与“会话文件的atime或者mtime”之间的差大于gc_maxlifetime:过期),并删除这些过期的session
- 如果你在一个session启动后,长时间没有任何交互操作(譬如,不停地码字,没有提交或者保存为草稿),那么你的保存在后台的会话文件将得不到机会被修改或者访问,在gc_maxlifetime(缺省值1440秒=24分钟)时间后,它有可能因失效而被清理,这以后你再提交,就会因为会话失效而报错
由此可见,gc_maxlifetime设置为24分钟,对于写某些文章来说还不够。这是一个原因,另外,session.save_path的缺省路径在linux上是/tmp,很少有程序会修改这个设置。如果这台服务器上有多个虚拟主机,那么,/tmp目录下会存放许多不同session_name的会话文件。糟糕的是,php的GC不区分会话归属,它会根据它取得的gc_maxlifetime来清理这个目录下的所有过期session文件。
据以上分析,解决方案是:UTBLOG在.htaccess文件内添加了一条语句,将session.gc_maxlifetime的local value扩大为14400(4小时),同时在后台将session.save_path设置为/tmp/utblog,这样,utblog的会话文件就不受其他网站干扰了,而4小时的失效时间,我想,无论如何应该够用了。
测试下来,一切如我所愿。
另,如果直接改动/etc/php.ini当然也可以。如果没有权限改动php.ini,也没有权限改动apache的conf文件,.htaccess被禁止,那么直接修改plog的sessionmanager.class.php文件,在session_start行前添加ini_alter("session.gc_maxlifetime", 14400)亦可。plog结构良好,只有这一处调用session_start,所以也只有这一处需要修改。我在本地做过测试,可以工作。
--------------------------------------------------------------------------
Note:
如果不同的脚本具有不同的 session.gc_maxlifetime 数值但是共享了同一个地方存储会话数据,则具有最小数值的脚本会清理数据。此情况下,与 session.save_path 一起使用本指令。
Note: 如果使用默认的基于文件的会话处理器,则文件系统必须保持跟踪访问时间(atime)。Windows FAT 文件系统不行,因此如果必须使用 FAT 文件系统或者其他不能跟踪 atime 的文件系统,那就不得不想别的办法来处理会话数据的垃圾回收。自 PHP 4.2.3 起用 mtime(修改时间)来代替了 atime。因此对于不能跟踪 atime 的文件系统也没问题了。
发表评论
-
php redis api
2014-10-25 10:13 2749参考:http://jianzhong5137.blog.1 ... -
php创建zookeeper临时变量
2014-10-17 18:37 1172临时变量会在连接断开之后被删除。 <?php ... -
设置session_id,现有的session数据会覆盖原有的
2014-08-30 11:27 973有两个session_id $sid1 = "d ... -
php的session不支持数字作为key的原因
2014-08-30 10:57 1795php_serialize is available fro ... -
PHP输入流php://input
2014-04-09 11:21 900转自: http://blog.csdn.net/lxzo1 ... -
php保留两位小数但不四舍五入
2013-12-23 18:10 746<?php $s = '1.339' ... -
PHP5的__clone实现深复制
2013-01-30 01:57 833<?php class cb{ va ... -
phpinfo() 中 Local Value Master Value 的区别
2012-12-19 00:09 994转自: http://hi.baidu.com/kkwtre/ ... -
php时区设置
2012-11-27 00:17 622转自: http://www.jb51.net/article ... -
关于php中trigger_error的日志输出到哪里的问题
2012-11-25 14:34 2993#display_errors display_errors ... -
打印调用栈的函数print_stack_trace
2012-10-10 22:07 6202打印调用栈的函数print_stack_trace ... -
时间戳转换为“年-月-日 时:分:秒”的格式
2012-09-18 11:38 1416<?php if($argc < 2){ ... -
启动php-cgi
2012-09-13 10:30 993命令为: php-cgi --fpm --fpm-confi ... -
php实用函数
2012-09-04 00:37 699常常会需要当经常会忘记,还是记下来吧 get_defin ... -
php session配置
2012-08-21 16:23 1014转自: http://blog.csdn.net/jallin ... -
php+mysql的安装
2012-08-15 17:35 914设用户名为work。 假设mysql已经安装成功,安装目录为 ... -
php用redis存储session的配置项示例
2012-08-06 23:09 938session.save_handler = re ... -
php正则表达式例子
2012-07-03 20:56 895* 判断字符串是否包含 ... -
How to use PHPUnit (CIUnit) with CodeIgniter 2.1.0
2012-06-20 17:07 2201转载自: http://d.hatena.ne.jp/Kenj ... -
php抓取网页内容的方法
2011-10-25 16:52 2073转自: http://bbs.phplovers.com/re ...
相关推荐
本文实例讲述了PHP session垃圾回收机制。分享给大家供大家参考,具体如下: session过期时间 在php.ini文件中有这样一个配置,这个配置表示session文件过期时间,默认的话是1440秒,也就是24分钟,这个24分钟是...
2. **session回收机制**: PHP使用一种称为垃圾收集(Garbage Collection, GC)的机制来处理过期的session。默认情况下,每次PHP请求有1/100的概率触发GC,这个概率由`session.gc_probability`和`session.gc_...
虽然自己也是PHP的学习者,但之前还真没怎么了解PHP内部的垃圾回收流程,只是在我们的代码中用了 unset,null,mysql_close,__destruct等等一些函数去释放对象防止内存溢出而已,所以上网GG下,找到了以下一些说明,
总结来说,要严格控制PHP中的session过期时间,需要综合考虑客户端cookie的生命周期、服务器端的垃圾回收机制以及代码层面的session检查。理解这些机制可以帮助开发者更好地管理和维护用户的会话状态,提供更加安全...
PHP中Session的过期回收机制是指PHP如何管理和回收过期的Session。PHP通过在php.ini配置文件中设置session.gc_maxlifetime参数来定义一个Session文件在服务器上可以存活的最长时间(默认是1440秒,即24分钟)。当...
在PHP开发中,Session是用于跟踪用户状态的一种机制,它在服务器端存储用户信息,而不仅仅是像Cookie那样在客户端存储。然而,系统默认情况下,PHP会将Session数据保存在文件系统中,这在多服务器环境或者高并发场景...
PHP SESSION的保存机制... session_start()是session机制的开始,它有一定概率开启垃圾回收,因为session是存放在文件中,PHP自身的垃圾回收是无效的,SESSION的回收是要删文件的,这个概率是根据php.ini的配置决定的,
此外,如果Session数据存储路径不在默认的 `/tmp` 目录,可能需要手动或通过定时任务(如crontab)来清理过期的Session文件,因为PHP的Session回收机制可能无法覆盖自定义路径。 总之,理解并掌握PHP的Session过期...
总的来说,这个“HP-socket 扩展 Session 包含GC垃圾回收机制”的实现,为易语言的开发者提供了一套完整的、类似于PHP的Session管理解决方案,同时解决了内存管理问题,适合于商业项目的开发。对于熟悉PHP Session的...
合理设置`session.gc_maxlifetime`,避免过早或过晚的垃圾回收。 4. **跨域处理**:如果需要在多个子域名间共享session,可以设置`session.cookie_domain`。 ### 五、session与cookie的比较 `session`和`cookie`...
PHP作为一门广泛使用的服务器端脚本语言,拥有垃圾回收机制是其一大特点,这个机制对于内存管理至关重要。PHP中的垃圾回收机制,又称为GC(Garbage Collector),其主要作用是自动回收内存中不再被引用的对象,避免...
`session_set_save_handler()` 函数允许开发者自定义 Session 的处理机制,包括数据的读取、写入、创建、销毁以及垃圾回收等操作。该函数的基本语法为: ```php bool session_set_save_handler(string $open, ...
1. PHP会话(Session)管理:PHP的Session机制用来保存用户状态信息,它通过会话ID(session id)来识别和跟踪不同用户的访问。默认情况下,PHP使用文件来存储会话数据,但通过特定的配置和脚本可以将数据存储到其他...
如果用户在指定的时间内没有与服务器交互,那么该Session就会被垃圾回收机制清理。要修改这个值,你可以按照以下方式操作: **方法 1: 修改php.ini配置** 打开php.ini文件,找到`session.gc_maxlifetime`行,将它...
7. **Session过期时间与回收机制**: PHP默认会根据配置文件(一般为php.ini)中的`session.cookie_lifetime`和`session.gc_maxlifetime`设置来控制Session的生命周期。`session.cookie_lifetime`指定了浏览器中的...