【发布时间】:2016-05-07 10:31:44
【问题描述】:
我有一个关于 Laravel 5.1 应用程序的奇怪问题。
间歇性地,它正在删除会话数据。我通过编写一些中间件来检测到这一点,该中间件将该请求的会话内容写入日志文件。虽然会话 ID (Session::getId()) 没有改变,但使用Session::all() 检索到的会话数据中_token 的值会发生变化。
正如我所说,这会间歇性地发生。我可以多次刷新同一个 URL,然后随机刷新一次,会话数据消失了,_token 值与之前的请求不同。
这是什么原因造成的?我还注意到 flash 对象不在“丢弃的”会话数据中。
下面是日志的sn-p。在最后两行可以看到session_data键的内容随机改变“形状”,但会话ID保持不变。
另外,不确定它是否相关,但我启用了DebugBar。
更新:通过调试,我发现在某些页面加载时,会话完全为空,例如,没有_token(因此获得了一个新的生成)。什么都没有。
【问题讨论】:
-
这种情况多久发生一次?因为我试图通过启用 DebugBar 来重现这一点,创建一个中间件,将会话 id 和数据记录为序列化 JSON,就像你正在做的那样,然后调用一个具有每秒自动刷新的视图的路由,并将其保留为大约10分钟。但它没有刷新 CSRF 令牌或删除任何会话数据。这是使用
artisan serve和file会话驱动程序完成的,因此您可能需要发布有关您的环境的更多信息。 -
每隔一两分钟就会发生一次。该应用程序在 Apache 下运行。我可以刷新一个 URL,它会在多次刷新后根据屏幕截图随机丢失数据。它没有真正的规律,这使得寻找原因变得困难。
-
我的第一个建议是尝试在全新安装的 Laravel 上重现问题,就像我在第一条评论中描述的那样,至少看看问题是否出在你的应用程序代码或设置中的其他内容。
-
在 L4,2 上搜索了类似问题后发现了这个问题。脚本完成后将写入会话。脚本是否有可能根本没有完成,而是被杀死了?我已经看到在一些使用字节缓存和重 AJAX 页面的 VPS 服务器上 - 太多的快速请求会导致 HTTP500 和 PHP 处理程序因某种内存违规而死亡。在这些情况下不会写入会话。
-
我也有同样的问题。 1. 当响应返回为 view::make() 时,它工作正常。 2.当response()->json()返回响应时刷新session._token hash。
标签: laravel session laravel-5.1