【问题标题】:Kohana 3.2 session expires too soon, shorter expirations work as expectedKohana 3.2 会话过期太快,较短的过期时间按预期工作
【发布时间】:2012-05-31 16:43:45
【问题描述】:

Kohana 3.2 会话即将过期。我目前的配置是:

return array(
'native' => array(
    'name' => 'kohanasession',
    'lifetime' => 0,       
 ),
);

使用lifetime => 0 表示会话将在浏览器关闭时结束。但是,1 小时后,会话到期。

我也尝试使用不同的生命周期(例如 36000 => 10 小时),但同样失败了。

如果我使用很短的会话寿命(例如 10 秒),那么过期将完美运行。据我检查,似乎如果我希望会话的生命周期超过 1 小时,它将无法正常工作。

最后是我们用于 php.ini 的相关配置

session.save_handler = memcache
session.save_path="tcp://127.0.0.1:11211?persistent=1&weight=1&timeout=1&retry_interval=15"
session.cache_limiter = nocache
session.gc_probability = 0

我真的迷路了。这应该很容易解决,但我就是无法解决。

【问题讨论】:

  • 尝试在没有 Kohana 会话库的情况下使用会话(创建一个简单的 PHP 脚本)。它将帮助您确定是 Kohana 问题还是服务器问题。

标签: php session kohana kohana-3.2


【解决方案1】:

lifetime => 0 参数可能只影响会话 cookie 的生命周期。

可能发生的情况是,当 cookie 工作正常时,您在服务器端丢弃了用户的会话数据。 PHP 的会话垃圾收集默认情况下有点奇怪:它会将会话标记为在 24 分钟空闲时间后过期,并且每个请求都有 1% 的机会清理所有过期的会话。

您可以增加 PHP ini 设置 session.gc_maxlifetime,或者您可以将 session.gc_probability 设置为零以完全禁用自动会话垃圾收集。

当然,您的 memcached 服务器也有可能被配置为在一段时间后丢弃数据。

更新:对于平均会话处理程序,将session.gc_probability 设置为零将是完全禁用自动清理的方法。但是,memcache 会话处理程序实际上已经不进行垃圾收集(它的 gc 回调什么也不做)。因此,使用该保存处理程序更改 session.gc_probability 或 session.gc_divisor 是没有意义的。

相反,memcache 保存处理程序会在将会话数据保存到 memcached 服务器时自动设置过期时间(expire 参数到 Memcache::set)。处理程序从session.gc_maxlifetime 设置中读取要使用的到期时间。所以,这是在您使用 memcache 会话保存处理程序时唯一真正重要的 GC 设置。

【讨论】:

  • 不幸的是,这不起作用,将gc_probability设置为0后,问题仍然存在。
  • 我的错。查看the memcache extension's source 很明显,“正常”会话 GC 代码没有与 memcache 处理程序一起使用。相反,处理程序在存储数据时自动设置expire 参数等于session.gc_maxlifetime。增加 maxlifetime 肯定会起作用,因为 应该 将 maxlifetime 设置为 0。
猜你喜欢
  • 2012-01-12
  • 1970-01-01
  • 1970-01-01
  • 2019-06-24
  • 2012-11-25
  • 2020-03-04
  • 2020-07-19
  • 2012-02-05
  • 1970-01-01
相关资源
最近更新 更多