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

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

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

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

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

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

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

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

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

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

阅读 5.2k
3 个回答

就问题分别回答:

  1. 不是。这个 session 的最后修改时间是最后一次请求服务器的时间(无论是页面还是接口)。
  2. 不一定。php.ini 文件的默认 session.gc_maxlifetime 值为 1440,只是代表 session 文件超过 1440 秒未访问则被视为垃圾,而不是会立即将其清除。是否清除文件取决于 gc 是否被触发,触发几率是针对每一个客户端请求而言的,每个请求都有 gc_probability / gc_divisor 的触发几率。

    官方引文:https://www.php.net/manual/en...
    session.gc_maxlifetime specifies the number of seconds after which data will be seen as 'garbage' and potentially cleaned up. Garbage collection may occur during session start (depending on session.gc_probability and session.gc_divisor).
  3. 描述不准确,应改为“也就是说只有超过 1440 秒不在这个网站活动session才会 被视为垃圾 ”,并不会立即删除。
  4. 正确的描述应该是,根据 session 文件的最后修改时间来判别是否被视为垃圾,如果被视为垃圾,若 gc 被触发,则该 session 将被清除。若 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自然失效。。。。个人浅显理解,如有错误希望有大神指正?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题