时间:2018-12-06 08:34:57

标签: php session

PHP会话逻辑具有两个不同的SessionHandlerInterfaceSessionUpdateTimestampHandlerInterface接口,而SessionUpdateTimestampHandlerInterface接口在文档中仍未完全描述。

SessionHandlerInterface::writeSessionUpdateTimestampHandlerInterface::updateTimestamp函数的感觉非常相似。两者具有相同的参数(会话ID和会话数据),并返回布尔值。

这两个功能有什么区别?

实现这两个功能的代码应该有什么区别?

如果没有为updateTimestamp函数提供时间戳的代码,应该如何更新时间戳?

编辑:我创建了一个PHP bug regarding the missing docs

1 个答案:

答案 0 :(得分:5)

这两种方法非常相似,但在不同情况下会被调用。

1)

没有SessionUpdateTimestampHandlerInterface的SessionHandler:

一个已登录的用户请求一个页面,并且该页面的所有数据均已加载。在请求期间,数据集将进行修改,一旦会话关闭,所有数据将再次写入存储(调用SessionHandlerInterface::write)。因此,您将一遍又一遍地写入相同的数据。

具有SessionUpdateTimestampHandlerInterface的SessionHandler:

相同的情况,但是现在如果数据集未修改,它将调用SessionUpdateTimestampHandlerInterface::updateTimestamp。优势在于,现在您知道您无需再次写入数据集,而只需更新现有数据集的生存期即可。这可以极大地提高性能。

2)

那取决于您存储会话/数据的位置。 SessionHandlerInterface::write应该真正写数据,而SessionUpdateTimestampHandlerInterface::updateTimestamp如果可能的话应该只是更新现有项目的生存期。 Symfony有不错的examples

3)

时间戳应与最大寿命相同,以便在每个请求上“重置”时间戳,就像普通写入一样。

目前提到的文件不足。在此RFC中可以找到一些很好的信息。