會話鎖定

我們都知道 PHP 將會話資料寫入伺服器端的檔案中。當請求通過 session_start() 啟動會話的 php 指令碼時,PHP 會鎖定此會話檔案,導致阻止/等待其他傳入請求相同的 session_id 完成,因此其他請求將被卡在 session_start() 上,直到或除非會話檔案已鎖定未釋放

會話檔案保持鎖定狀態,直到指令碼完成或手動關閉會話。為了避免這種情況,即為了防止多個請求被阻止,我們可以啟動會話並關閉會話,該會話將從會話檔案釋放鎖定並允許繼續其餘請求。

// php < 7.0 
// start session 
session_start();

// write data to session
$_SESSION['id'] = 123; // session file is locked, so other requests are blocked

// close the session, release lock
session_write_close();

現在人們會想,如果會話已經關閉,我們將如何讀取會話值,即使在會話結束後美化,會話仍然可用。所以,我們仍然可以讀取會話資料。

echo $_SESSION['id'];    // will output  123

PHP> = 7.0 ,我們可以有 READ_ONLY 會議, READ_WRITE 會議和 lazy_write 會話,因此使用 session_write_close() 可能不需要