Codeigniter的sess_time_to_update是如何工作的?

13

基于以下问题/回答: CodeIgniter在Chrome上无法使用session类

我遇到的问题是,在美国服务器远离的另一个国家,人们无法登录我的网站。经过在线搜索,我发现了一些建议,描述了问题基于服务器时区和用户时区之间的差异。因此,通过扩展session_expiration,我成功解决了问题,并且人们能够成功登录。

我的问题是,sess_time_to_update是否会创建一个新的时间戳,并且由于新的时间戳位于错误的时区,它将注销用户? 我是否需要将新的sess_time_to_update延长17小时以上,以涵盖我链接中解释的最广泛的时区范围? 是否有其他方法可以基于用户的本地时间存储会话(而不要求他们在配置文件中选择时区或其他用户不友好的方案)?我希望具有2小时默认会话过期时间+800秒更新时间。我没有使用数据库来存储会话,我也不愿意使用它。

1个回答

14
sess_time_to_update 是用来控制更新会话详细信息(例如最后活动时间)的时间。默认值为每五分钟(300秒)生成一个新的会话ID,这将根据sess_expiration设置重置到期日期。
建议保持 sess_time_to_update 的默认值(或更低),因为这将使用户会话保持更长时间,因为会话过期时间将不断被重置。唯一需要保持高的设置可能是sess_expiration,除非您可以确定用户的时区。
有几种方法可以尝试确定用户的时区。其中之一是使用Javascript(例如:客户端时区偏移),或者您可以尝试使用PHP的GEOIP方法。

那么这是否意味着session_time_to_update仅更新ID和过期日期而不更新时间戳?另外,我想知道为什么会话不是根据用户的浏览器时间或某种本地时间生成,而是根据服务器时间生成。 - Ando
过期日期是根据sess_expiration设置和最后一次用户活动发生的时间戳来确定的。 sess_time_to_update更新最后活动时间戳并重新生成会话ID,因此还会自动更新会话过期时间(最后活动+ sess_expiration)。 会话无法使用用户的时间生成,因为CI(和PHP)无法确定该信息,因为它是浏览器端,而代码在服务器端运行。 - justanotherprogrammer
嗯...抱歉,但是为什么您建议将sess_time_to_update保持较低呢?我真的不希望用户只是“因为”而获得新的会话ID。 - Yevgen
2
正如前面的评论所述,它不仅生成新的会话ID,还更新了上一次活动的时间戳,从而更准确地保持会话处于活动状态。如果您将sess_time_to_update设置得太高,可能会出现用户会话被销毁的情况,尽管他们可能正在进行某些操作。需要告诉CI定期更新以保持会话处于活动状态。更新频率取决于您的应用程序。如果您的会话长度为3小时,则5分钟以下的时间可能过猛,但如果您的会话设置为15分钟,则最好使用更小的时间范围。 - justanotherprogrammer
所以 - 我查看了我的 'sess_save_path' 文件夹,发现有超过1000个ci_sesson文件 - 对于每天只有3个人登录的网站来说,这是必要的吗? - user8588978
不,我认为那不正常。我习惯使用基于数据库的会话,但我想在你的情况下也是一样的 - 会话管理由PHP的垃圾回收处理。垃圾回收运行的频率基于php.ini中的几个设置,session_gc_probability和session_gc_divisor。如果概率设置为0,则永远不会收集垃圾,您的会话数量将继续增长。 - justanotherprogrammer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接