会话锁定

我们都知道 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() 可能不需要