【问题标题】:Auth timeout problems with CakePHPCakePHP 的身份验证超时问题
【发布时间】:2011-04-03 14:45:15
【问题描述】:

这真的让我很烦。已经好几年了。无论我用 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 值中”之前,让我告诉你,这个站点通常会在大约 20 分钟后超时!

【问题讨论】:

  • 您的 cookie 设置的生命周期价值是多少?是 cookie 过期还是会话被垃圾收集的问题? (使用 Firebug 检查两者,是否在“网络”选项卡中发送/检索 cookie。)
  • 只设置了两个 cookie:CAKEPHP 和 CakeCookie[lang]。它们都有很长的寿命(2035 年和 2011 年)。我目前正在调查某些图像和 css 404 可能会触发 Auth 的可能性。
  • 关于此的一些新信息:会话没有被破坏,就像我尝试再次加载页面一样 - 使用后退按钮或重新输入 url - 无需登录即可正常加载. 我认为我的应用程序或蛋糕中发生了一些奇怪的事情。
  • 设置 session.gc_probability = 0 将意味着永远不会发生清理,因此会话将无限期持续(或直到 Cake 自己决定它们已过期)。

标签: php session cakephp timeout


【解决方案1】:

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

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');

到目前为止,系统还没有注销。

【讨论】:

  • 现在,大约一周后,它似乎仍然运行良好。同事们还报告说它现在的行为符合预期。
  • 我尝试了同样的事情,但切换到 session.save 'cake' 会导致重定向循环 310 错误。我做错了什么?
【解决方案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 作业脚本可能正在调用会话清理过程。

【讨论】:

  • 1.这是我会尝试的——我在其他地方看到共享主机可能有点像那样顽皮。 2.我原来Q中的值是phpinfo输出的。 3. 大概 1. 会避免这种情况?
  • 2. phpinfo() 为您提供适用于您正在运行的虚拟主机的值 - 使用 Cake 的实际应用程序呢?不太可能,但有些东西可能会覆盖您的 php.ini 设置。 3. 不,这是一个单独的问题。在命令行上运行php --ini 并将其与 phpinfo() 输出进行比较,以使 CLI 版本使用与您正在修改的配置文件相同的配置文件。
  • 2.我很确定没有什么会覆盖 php.ini 设置。 3. 我没有任何 cron 作业,但 CLI 使用的是不同的 ini。
【解决方案3】:

如果您在同一台服务器上有多个 CakePHP 应用程序,这可能是您遇到麻烦的原因。别忘了:

  1. 为每个应用添加不同的前缀(core.php 上的 $prefix)。
  2. 更改每个cookie路径的名称:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多