Laravel 4.1 会话变量被随机遗忘

Posted

技术标签:

【中文标题】Laravel 4.1 会话变量被随机遗忘【英文标题】:Laravel 4.1 session variables getting randomly forgotten 【发布时间】:2014-06-22 08:50:45 【问题描述】:

我在 Apache 上使用 Laravel 4.1 应用程序,在我的本地开发机器上一切正常,但在我的登台机器(在共享主机上)上,用户随机退出并提示输入他们的凭据再次。

相关设置:

app/config/session.php:

<?php
return array(
    'driver' => 'file',
    'lifetime' => 120,
    'expire_on_close' => true,
    'files' => storage_path().'/sessions',
    'connection' => null,
    'table' => 'sessions',
    'lottery' => array(2, 100),
    'cookie' => 'laravel_session',
    'path' => '/',
    'domain' => null,
    'secure' => false,
);
使用 Laravel 的默认认证驱动 php.ini: gc_maxlifetime=1440 gc_probability=1 gc_divisor=100

这似乎与其他一些人遇到的问题here 不同。会话文件没有被 php 清除。只有少数会话变量被随机删除。

tail -F'd 会话文件,可以看到变量在一个请求和下一个请求之间被丢弃的时间。之前看起来像这样(为便于阅读而格式化):

a:4:
    s:5:"flash";a:2:s:3:"old";a:0:s:3:"new";a:0:
    s:6:"_token";s:40:"hvuw9VWWjssSwUL2C5eVSn0qZ2g1cwVF5YCEsLG7";
    s:38:"login_82e5d2c56bdd0811318f0cf078b78bfc";i:2;
    s:9:"_sf2_meta";a:3:s:1:"u";i:1399318721;s:1:"c";i:1399318011;s:1:"l";s:1:"0";

之后:

a:3:
    s:6:"_token";s:40:"7o3b6NhiuDKXq4ftvngUefqe6cWybX1tzPEcDaxk";
    s:9:"_sf2_meta";a:3:s:1:"u";i:1399318721;s:1:"c";i:1399318721;s:1:"l";s:1:"0";
    s:5:"flash";a:2:s:3:"old";a:0:s:3:"new";a:0:

login_ 会话消失了,这导致 Laravel 的 Session 类假设用户未通过身份验证。不过,我不确定为什么这个会话变量会被删除。据我所知,没有在登录会话变量上调用 Session::forget、::clear()、::remove() 或 ::invalidate()。

我还注意到 _token 变量在请求之间是恒定的,直到问题出现的那一刻它发生变化,正如您在上面看到的那样。

知道这里发生了什么吗?

【问题讨论】:

您能发布您的完整会话配置吗?另外-您可以尝试替代会话驱动器吗?也许数据库暂时看看问题是否仍然存在? 好的,我已经在上面发布了我的 session.php 虽然不完全是个问题 - 将您的 cookie 名称更改为“某物” - 不要使用下划线 - 这可能会导致问题。另外 - 尝试关闭 expire_on_close 看看是否有帮助。 ***.com/q/15016204/1317935 我认为您的会话正在被销毁并重新生成。这就是为什么当您丢失 _login 数据时,您会有一个新令牌。 我不相信会话正在被破坏,因为会话文件在整个过程中保持不变,具有相同的文件名/ID。如果被销毁了不会有新的会话文件吗? 【参考方案1】:

切换到数据库会话管理器似乎已经解决了这个问题。我怀疑我的主机服务器配置中有某种方式 php 正在清除会话文件。

【讨论】:

以上是关于Laravel 4.1 会话变量被随机遗忘的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 4.1 - 多个 ajax 请求导致会话持久性失败

Laravel 4.1 身份验证会话数据不会跨请求持久化

Laravel 会话随机过期

Laravel 路由问题:自动重定向到根文件夹

在 laravel 5.1 中打印所有正在运行的会话变量

Laravel 5.3 登录成功后声明全局会话变量