CakePHP的Auth超时问题

时间:2010-08-25 08:53:17

标签: php session cakephp timeout

这真让我烦恼。已经多年了。无论我使用core.php或php.ini做什么,我的登录大约一小时后就会超时 - 通常。在相当长的时间之后,相同代码和配置的某些部署会超时。

这就是我现在在一个网站上所拥有的 - 大约一个小时后超时:

session.gc_divisor  1000
session.gc_maxlifetime  86400
session.gc_probability  1

Configure::write('Session.timeout', '28800');
Configure::write('Session.checkAgent', false);
Configure::write('Security.level', 'medium');

另一个 - 持续了一整夜:

session.gc_divisor  100
session.gc_maxlifetime  14400
session.gc_probability  0

Configure::write('Session.timeout', '315360000');
Configure::write('Session.checkAgent', false);
Configure::write('Security.level', 'medium');

现在,在你兴奋之前说:“好吧,答案就在于Session.timeout值”,让我告诉你这个网站通常会在大约二十分钟后超时!

3 个答案:

答案 0 :(得分:4)

在某处我读到共享主机,其他应用程序可以通过清除php定义的会话目录来重置会话。罗尔夫在回答中提到了这一点。

CakePHP提供了配置会话处理方式的选项。在core.php我将其更改为'cake'(默认情况下为'php'):

/**
 * The preferred session handling method. Valid values:
 *
 * 'php'            Uses settings defined in your php.ini.
 * 'cake'       Saves session files in CakePHP's /tmp directory.
 * 'database'   Uses CakePHP's database sessions.
 */
Configure::write('Session.save', 'cake');

我还确保会话超时和相应的php.ini值相同:

/**
 * Session time out time (in seconds).
 * Actual value depends on 'Security.level' setting.
 */
Configure::write('Session.timeout', '86400');

到目前为止,系统还没有退出。

答案 1 :(得分:2)

我认为这不是特定于蛋糕的东西;我没有涉及任何框架时看到它 - 它很可能是你的PHP配置设置的问题。

您应该检查/做的事情来解决问题:

  1. 指定要存储的专用路径 session.save_path中的会话(如果您尚未这样做)。 不要将它们存储在/ tmp中 - 其他一些进程可能会出现并擦除它们 为了你。

  2. 确保(我的意思是确实确定)session.gc_maxlifetime的值是您认为的(如果您希望登录在24小时后超时,则为86400)不活动等。与session.gc_divisorsession.gc_probability相同。即使PHP Manual指定可以在任何级别设置会话设置,取决于PHP构建的笨拙(它们都以微妙的方式略微错误:))您可能会发现它们实际上并没有效果除非在全局php.ini文件中设置,而不是在代码,.htaccess等中设置。只需在实际应用中输出它们以确保它们已应用。

  3. 此外,根据您的环境,检查PHP CLI构建是否使用与默认PHP构建相同的php.ini文件 - 如果CLI构建使用另一个配置文件并且您使用CLI进行了cron作业构建时,cron作业脚本可以调用会话清理过程。

答案 2 :(得分:1)

如果你在同一台服务器上有很多CakePHP应用程序,这可能是你遇到麻烦的原因。不要忘记:

  1. 以不同方式为每个应用程序添加前缀(core.php上的$前缀)。
  2. 更改每个Cookie路径的名称:

    Configure::write('Session', array(
    'defaults' => 'php',
    'timeout' => 4320,
    'ini' => array(
        'session.cookie_path' => '/name_app', // this for each app
    )));