Laravel 5.1随机丢弃会话数据

时间:2016-01-29 16:00:05

标签: laravel session laravel-5.1

我对Laravel 5.1应用程序有一个奇怪的问题。

间歇性地,它正在丢弃会话数据。我通过编写一些将该请求的会话内容写入日志文件的中间件来检测到这一点。虽然会话ID(Session::getId())不会更改,但使用_token 检索的会话数据中Session::all()的值

正如我所说,这种情况间歇性地发生。我可以多次刷新相同的URL,然后随机刷新会话数据,并且_token值与之前的请求不同。

这会导致什么?我还注意到flash对象不在“已删除”的会话数据中。

下面是日志的片段。您可以看到session_data键的内容在最后两行中随机更改“形状”,但会话ID保持不变。

另外,不确定它是否相关,但我启用了DebugBar

Screen-shot

UPDATE:通过调试,我发现在某些页面加载时,会话完全为空,就像没有_token一样(因此是新的一个得到生成)。什么都没有。

3 个答案:

答案 0 :(得分:3)

  1. 如果您正在使用文件驱动程序,则可能会遇到并发请求的竞争条件。该文件然后被截断,Laravel无法读取它,因此它刷新会话。竞争条件也可能导致一种症状,即您正在进行的会议中的某些内容不会被放入。这往往是随机的,因此调试非常困难。根据Laravel团队的说法,这是文件驱动程序的一个已知限制,它似乎没有得到修复,所以我建议使用不同的驱动程序。这将解决您的随机会话刷新问题,但它仍然可能会对未添加的会话进行更改。据我所知,在Laravel 5.1的这一点上,你必须自己管理它。

  2. 不知何故,您的会话数据太长而被截断。如果您正在使用数据库驱动程序(尚未测试其他驱动程序),并且您尝试保存长度超过字段长度的会话数据,则后续请求将无法从此会话中获取,并且您将会风新会议。如果这个问题是随着非常短的会话数据随机发生的,那么它可能是上面列出的原因。

答案 1 :(得分:0)

如果您使用Linux,请尝试使用Redis(http://redis.io)作为laravel中的会话/缓存管理器。过去我在一些服务器上有文本/ cookie和laravel的问题。当我安装Redis时,我已经没有问题了。

更多信息:https://laravel.com/docs/5.1/redis

答案 2 :(得分:0)

使用像memcached这样的其他驱动程序无法为我解决问题。 这是一个实现会话锁定的程序包,该程序可以正常工作,并且很容易集成到您的项目中。

https://github.com/rairlie/laravel-locking-session