Laravel 8 Session 阻塞

2021-07-17 16:05 更新

注意:要利用會話阻止,您的應用程序必須使用支持 atomic locks 的緩存驅(qū)動。 當前,這些緩存驅(qū)動包括 memcacheddynamodb,redisdatabase 驅(qū)動程序。 另外,您不能使用 cookie 驅(qū)動。

默認情況下,Laravel 允許使用同一 session 的請求并發(fā)執(zhí)行。 例如,如果您使用 JavaScript HTTP 庫向應用程序發(fā)出兩個 HTTP 請求,則它們將同時執(zhí)行。 對于許多應用程序來說,這不是問題。 但是,在一小部分應用程序中可能會丟失 session 數(shù)據(jù),這些應用程序會向兩個不同的應用程序端點同時發(fā)出請求,這兩個端點都將數(shù)據(jù)寫入 session。

為了處理這種情況,Laravel 允許您限制指定會話的并發(fā)請求。 首先,您可以簡單地在定義路由時調(diào)用 block 方法。 在這個例子中,進入到 /profile 端點的請求將添加會話鎖。 在會話鎖期間,/ profile/ order 端點共享相同 session ID 的任何請求都將等待第一個請求執(zhí)行完成,然后再繼續(xù)執(zhí)行:

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

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

block 方法接受兩個可選參數(shù)。 第一個參數(shù)是會話鎖在釋放之前應保持的最大秒數(shù)。 當然,如果請求在此時間之前完成執(zhí)行,則鎖將更早釋放。

第二個參數(shù)是請求嘗試獲得會話鎖時應等待的秒數(shù)。 如果請求無法在給定的秒數(shù)內(nèi)獲得會話鎖,則將拋出 Illuminate\Contracts\Cache\LockTimeoutException。

如果這些參數(shù)都未傳遞,那么將最多獲得 10 秒的鎖定,而嘗試獲得鎖定的請求將最多等待 10 秒:

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


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號