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