我不確定為什麼這個方法需要資料,如果它只更新時間戳記的話。否則,這與「寫入」方法有何不同?我認為這令人困惑,而且很遺憾,手冊沒有提供太多關於整個工作階段機制的信息。
(PHP 7, PHP 8)
SessionUpdateTimestampHandlerInterface::updateTimestamp — 更新時間戳記
更新工作階段的最後修改時間戳記。當工作階段更新時,此函式會自動執行。
id
工作階段 ID。
data
工作階段資料。
我不確定為什麼這個方法需要資料,如果它只更新時間戳記的話。否則,這與「寫入」方法有何不同?我認為這令人困惑,而且很遺憾,手冊沒有提供太多關於整個工作階段機制的信息。
當 session.lazy_write 啟用時(這是預設行為),如果工作階段資料保持不變,則不會更新,這樣工作階段處理程式的 WRITE 方法根本不會被呼叫。
如果您的工作階段處理程式將工作階段資料儲存到檔案中,則 UpdateTimestamp 用於更新工作階段檔案的「上次修改時間」;如果您的工作階段處理程式將工作階段資料儲存到資料庫中,則 UpdateTimestamp 用於更新儲存工作階段註冊上次修改時間的表格欄位。
『validateId』會在『open』之後和『read』之前被呼叫,以驗證客戶端提供的工作階段 ID,因為『open』 -> 『validateId』 -> 『read』 -> 『write』 -> 『close』會依序被呼叫。
如果『validateId』返回 false,則會產生新的工作階段 ID,之後也會更新工作階段 cookie。
使用 updateTimestamp 函式中可用的 $sessionData 的範例。
當我們嘗試使用 cookie 作為儲存工作階段資料的容器時,這非常有用。
在 cookie 中,我們需要維護存取時間戳記,類似於檔案的存取時間。
這裡我們使用 php_serialize 作為 session.serialize_handler,以便對工作階段編碼資料使用 serialize() 和 unserialize()。
<?php
public function updateTimestamp($sessionId, $sessionData)
{
$sessionDataArr = unserialize($sessionData);
$sessionDataArr['_TS_'] = $this->currentTimestamp;
$sessionData = serialize($sessionDataArr);
$cookieData = $this->encryptData($sessionData);
if (strlen($cookieData) > 4096) {
ob_end_clean();
die(‘工作階段資料長度超過每個 Cookie 支援的最大值 4 KB’);
}
return setcookie(
$name = $this->sessionDataName,
$value = $cookieData,
$options = [
'expires' => 0,
'path' => '/',
'domain' => '',
'secure' => ((strpos($_SERVER['HTTP_HOST'], 'localhost') === false) ? true : false),
'httponly' => true,
'samesite' => 'Lax'
]
);
}
?>