【发布时间】:2014-07-24 18:09:34
【问题描述】:
我有一个页面让两个 ajax 请求被同一个事件触发,所以它们几乎是同步触发的。
这会导致 Laravel 4.1 出现一些问题。似乎 ajax 调用的每个请求都试图重写会话(我正在使用文件驱动程序),结果是写入了一个新会话,给我留下了两个会话文件,最新的一个是使用的。这个最新的没有会话数据,所以我的用户已注销。
从存储文件夹看来,每个 http 请求都会删除当前会话,然后重写一个新的会话文件。只要在重写会话之前没有另一个 http 请求就可以了。如果有另一个快速连续的请求(例如来自同一个页面的两个 ajax 调用在同一个事件上触发),则会话被破坏。我假设这是因为第二次调用会查找要持久的会话数据,但找不到。
我也尝试过 memcached 和 cookie 驱动程序,但我遇到了与文件驱动程序相同的问题。 我也尝试过使用 'return response::json(...)' ,正如我在论坛其他地方发现的建议解决方案一样,但没有任何乐趣。
有什么建议吗?我没有找到任何体面的解决方案。当然,Laravel 必须有一种方法来处理快速连续的请求并保持会话?
【问题讨论】:
-
从来没有遇到过向服务器发出高频请求的问题(构建一个带有大量 ajax 调用的 L4 应用程序)。 apache 服务器为每个请求(并行)创建一个新进程。我不知道它如何处理 IO 操作,但我认为它使用文件上的锁定状态来防止竞争条件。写的时候锁,写的时候解锁。也想使用该文件的请求(进程)等待直到它被解锁。所以我认为问题是别的。
-
当你在事件中为第二个ajax请求添加延迟时,它会起作用吗?
setTimeout(function() { your_ajax_call }, 500);. -
@Sven - 是的,当我添加延迟时,问题就消失了。每次重新加载都会重写会话文件。会话文件在请求时被销毁,然后在响应时重新生成。这是 laravel 会话的正确行为吗?
-
那么你至少有一个解决方法;)我不知道 Laravel 会话过程,所以无法帮助你..
标签: php ajax session laravel laravel-4