我不确定为什么此方法需要数据,如果它只更新时间戳。否则,这是否与“写入”方法相同?我认为这很混乱,而且手册不幸地没有提供太多关于整个会话机制的信息。
(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 中,我们需要维护访问时间戳,类似于文件的访问时间。
这里我们有 session.serialize_handler 作为 php_serialize 来使用 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('Session data length exceeds max 4 kilobytes (KB) supported per Cookie');
}
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'
]
);
}
?>