我在Laravel 5.1应用程序中遇到了一个奇怪的问题。
间歇性地,它正在丢弃会话数据。我通过编写一些中间件将该请求的会话内容写入日志文件来检测到这一点。虽然会话ID(Session::getId()
)没有改变,但使用Session::all()
* 检索的会话数据中的_token
的值会改变 *。
就像我说的,这种情况间歇性地发生。我可以多次刷新同一个URL,然后随机刷新一次,会话数据就消失了,_token
值与以前的请求不同。
是什么导致的?我还注意到flash
对象不在“丢弃的”会话数据中。
下面是日志的片段。您可以看到session_data
密钥的内容在最后两行中随机更改“形状”,但会话ID保持不变。
此外,不确定它是否相关,但我启用了DebugBar。
**UPDATE:**通过调试,我发现在某些页面加载时,会话完全为 * 空 *,如没有_token
(因此生成了一个新的会话)。没什么
3条答案
按热度按时间0s7z1bwu1#
1.如果您使用的是文件驱动程序,则可能会在并发请求上遇到竞争条件。然后文件被截断,Laravel无法读取它,所以它刷新会话。竞争条件也可能导致一种症状,即您在会话中放置的东西没有被放置。这往往是随机的,所以很难调试。根据Laravel团队的说法,这是文件驱动程序的一个已知限制,而且似乎还没有得到修复,所以我建议使用不同的驱动程序。这将解决随机会话刷新的问题,但它仍然引入了对会话进行更改而不添加的可能性。据我所知,在Laravel 5.1的这一点上,你必须自己管理。
1.不知何故,您的会话数据太长,并被截断。如果您使用的是数据库驱动程序(尚未测试其他驱动程序),并且您试图保存比字段长度更长的会话数据,则后续请求将无法从该会话中提取,并且您将结束一个新会话。如果这个问题是在非常短的会话数据中随机发生的,那么它可能是上面列出的原因。
wydwbb8l2#
如果你使用的是Linux,请尝试在laravel中使用Redis(http://redis.io)作为会话/缓存管理器。我过去在一些服务器上使用text / cookies和laravel时遇到过一些问题。当我安装Redis时,我再也没有问题了。
更多信息:https://laravel.com/docs/5.1/redis
cx6n0qe33#
使用像
memcached
这样的不同驱动程序并没有解决我的问题。这里有一个实现会话锁定的包,它可以工作并且非常简单地并入您的项目。https://github.com/rairlie/laravel-locking-session