PHP Conference Japan 2024

SessionUpdateTimestampHandlerInterface::updateTimestamp

(PHP 7, PHP 8)

SessionUpdateTimestampHandlerInterface::updateTimestamp更新时间戳

描述

public SessionUpdateTimestampHandlerInterface::updateTimestamp(string $id, string $data): bool

更新会话的最后修改时间戳。此函数在会话更新时自动执行。

参数

id

会话 ID。

data

会话数据。

返回值

如果时间戳已更新,则返回 true,否则返回 false。请注意,此值会内部返回给 PHP 以进行处理。

添加注释

用户贡献的注释 4 条注释

tuncdan dot ozdemir dot peng at gmail dot com
1 年前
我不确定为什么此方法需要数据,如果它只更新时间戳。否则,这是否与“写入”方法相同?我认为这很混乱,而且手册不幸地没有提供太多关于整个会话机制的信息。
ohcc at 163 dot com
4 年前
当启用 session.lazy_write 时,这是默认行为,如果会话数据保持不变,则不会更新会话数据,这样会话处理程序的 WRITE 方法根本不会被调用。

如果您的会话处理程序将会话数据存储到文件中,则 UpdateTimestamp 用于更新会话文件的“上次修改时间”,如果您的会话处理程序将会话数据存储到数据库中,则 UpdateTimestamp 用于更新存储会话注册表上次修改时间的表字段。
ohcc at 163 dot com
4 年前
'validateId' 在 'open' 之后和 'read' 之前被调用以验证客户端提供的会话 ID,因为 'open' -> 'validateId' -> 'read' -> 'write' -> 'close' 按顺序被调用。

如果 'validateId' 返回 false,则会生成一个新的会话 ID,会话 cookie 也会随后更新。
polygon dot co dot in at gmail dot com
1 个月前
使用 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'
]
);
}
?>
To Top