欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

关于php session 有效期 的一点疑问

程序员文章站 2022-04-29 16:58:49
...
php.ini 设置默认的 session.gc_maxlifetime 值为1440,我该怎么理解这个值。

当我访问需要登录的网站的时候,一般情况下一直在操作的话登录时不会失效的,当达到一段时间没有操作,那么就需要重新登录了。我看了下网上的一些资料,了解了session的保存方式和回收机制,但还是有个问题理解的不是很清楚。

先不考虑这个回收机制可能造成的问题,也不考虑cookie(假设cookie是一直有效的)。

假设session.gc_maxlifetime设置的就是这个默认值 1440,我第一次登录的时候操作了session,保存了用户信息,之后就没有改变过session。

  • 是不是之后我不管发起了多少次请求,这个session的修改时间依旧是我登录的时间?

  • 是不是超过1440秒之后session就失效了,不管我有没有在这个网站操作?

  • 还是说我一直在这个网站操作,session 的修改时间会更新,也就是说只有超过1440秒不在这个网站活动session才会删除?

  • 还是session不是根据修改时间来删除的,只有在超过一定的时间不活跃之后才会删除?

希望的到一份详细一点的回答,谢谢!

回复内容:

php.ini 设置默认的 session.gc_maxlifetime 值为1440,我该怎么理解这个值。

当我访问需要登录的网站的时候,一般情况下一直在操作的话登录时不会失效的,当达到一段时间没有操作,那么就需要重新登录了。我看了下网上的一些资料,了解了session的保存方式和回收机制,但还是有个问题理解的不是很清楚。

先不考虑这个回收机制可能造成的问题,也不考虑cookie(假设cookie是一直有效的)。

假设session.gc_maxlifetime设置的就是这个默认值 1440,我第一次登录的时候操作了session,保存了用户信息,之后就没有改变过session。

  • 是不是之后我不管发起了多少次请求,这个session的修改时间依旧是我登录的时间?

  • 是不是超过1440秒之后session就失效了,不管我有没有在这个网站操作?

  • 还是说我一直在这个网站操作,session 的修改时间会更新,也就是说只有超过1440秒不在这个网站活动session才会删除?

  • 还是session不是根据修改时间来删除的,只有在超过一定的时间不活跃之后才会删除?

希望的到一份详细一点的回答,谢谢!

SESSION的回收是在每次访问页面的时候进行:

回收的机率 = session.gc_probability/session.gc_divisor,默认是1/1000.如果设置为1,则每次超过了SESSION的生存周期(session.gc_maxlifetime,默认是1440秒也就是24分钟)去访问的话,SESSION一定会被回收. 客户端每访问一次SESSION中的变量,SESSION文件的访问时间就会进行更新. 每次访问都是根据客户端存储的PHPSESSID这个cookie去请求服务器中存储的唯一的SESSION. 当客户端的cookie过期后,就无法知道要访问的是哪一个SESSION,尽管此时服务器上的SESSION文件还没有被过期收回,这样就会造成服务器资源的浪费. 如果用户通过点击"退出"按钮退出系统,这时程序可以注销掉cookie和session. 如果用户没有通知系统就关闭浏览器退出,sess_PHPSESSID文件则只能依赖手动回收.

PHP的session采用被动的回收机制,过期的session文件不会自己消失,而是通过请求触发"回收"来处理过期的session.
这时可以定时任务(crontab)自动删除过期的session:
找出24分钟前的文件并删除:
find /path/to/sessions -cmin +24 -type f | xargs rm

这个值是距离你最后一次刷新页面的时间,也就是你刷新完页面后24分钟未做任何操作,服务端就会把session删除掉。但是,是否会删除又和在php.ini中设置的删除命中率有关,如session.gc_divisor=1000,session.gc_probability=1,就表示每一千个用户调用session_start()的时候,就百分百的会执行一次垃圾回收机制,将磁盘上没用的session文件删除。而这个删除又不确定是哪个用户的session文件。所以,session是会话技术,就当成与浏览器是否关闭重写打开放在一起理解就好。就是,我只要关闭浏览器了,这次会话就断了,那个session自然失效。。。。个人浅显理解,如有错误希望有大神指正?

相关标签: php