Laravel 8 Session 阻塞

2021-07-17 16:05 更新

注意:要利用会话阻止,您的应用程序必须使用支持 atomic locks 的缓存驱动。 当前,这些缓存驱动包括 memcacheddynamodbredisdatabase 驱动程序。 另外,您不能使用 cookie 驱动。

默认情况下,Laravel 允许使用同一 session 的请求并发执行。 例如,如果您使用 JavaScript HTTP 库向应用程序发出两个 HTTP 请求,则它们将同时执行。 对于许多应用程序来说,这不是问题。 但是,在一小部分应用程序中可能会丢失 session 数据,这些应用程序会向两个不同的应用程序端点同时发出请求,这两个端点都将数据写入 session。

为了处理这种情况,Laravel 允许您限制指定会话的并发请求。 首先,您可以简单地在定义路由时调用 block 方法。 在这个例子中,进入到 /profile 端点的请求将添加会话锁。 在会话锁期间,/ profile/ order 端点共享相同 session ID 的任何请求都将等待第一个请求执行完成,然后再继续执行:

Route::post('/profile', function () {
    //
})->block($lockSeconds = 10, $waitSeconds = 10)

Route::post('/order', function () {
    //
})->block($lockSeconds = 10, $waitSeconds = 10)

block 方法接受两个可选参数。 第一个参数是会话锁在释放之前应保持的最大秒数。 当然,如果请求在此时间之前完成执行,则锁将更早释放。

第二个参数是请求尝试获得会话锁时应等待的秒数。 如果请求无法在给定的秒数内获得会话锁,则将抛出 Illuminate\Contracts\Cache\LockTimeoutException

如果这些参数都未传递,那么将最多获得 10 秒的锁定,而尝试获得锁定的请求将最多等待 10 秒:

Route::post('/profile', function () {
    //
})->block()


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号