阅读(2260)
赞(9)
Laravel 8 Session 阻塞
2021-06-25 09:32:05 更新
注意:要利用会话阻止,您的应用程序必须使用支持 atomic locks 的缓存驱动。 当前,这些缓存驱动包括
memcached
,dynamodb
,redis
和database
驱动程序。 另外,您不能使用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()