PHP会话逻辑具有两个不同的SessionHandlerInterface
和SessionUpdateTimestampHandlerInterface
接口,而SessionUpdateTimestampHandlerInterface
接口在文档中仍未完全描述。
SessionHandlerInterface::write
和SessionUpdateTimestampHandlerInterface::updateTimestamp
函数的感觉非常相似。两者具有相同的参数(会话ID和会话数据),并返回布尔值。
这两个功能有什么区别?
实现这两个功能的代码应该有什么区别?
如果没有为updateTimestamp
函数提供时间戳的代码,应该如何更新时间戳?
编辑:我创建了一个PHP bug regarding the missing docs。
答案 0 :(得分:5)
这两种方法非常相似,但在不同情况下会被调用。
1)
没有SessionUpdateTimestampHandlerInterface
的SessionHandler:
一个已登录的用户请求一个页面,并且该页面的所有数据均已加载。在请求期间,数据集将不进行修改,一旦会话关闭,所有数据将再次写入存储(调用SessionHandlerInterface::write
)。因此,您将一遍又一遍地写入相同的数据。
具有SessionUpdateTimestampHandlerInterface
的SessionHandler:
相同的情况,但是现在如果数据集未修改,它将调用SessionUpdateTimestampHandlerInterface::updateTimestamp
。优势在于,现在您知道您无需再次写入数据集,而只需更新现有数据集的生存期即可。这可以极大地提高性能。
2)
那取决于您存储会话/数据的位置。 SessionHandlerInterface::write
应该真正写数据,而SessionUpdateTimestampHandlerInterface::updateTimestamp
如果可能的话应该只是更新现有项目的生存期。 Symfony有不错的examples。
3)
时间戳应与最大寿命相同,以便在每个请求上“重置”时间戳,就像普通写入一样。
目前提到的文件不足。在此RFC中可以找到一些很好的信息。