mouf/utils.session.optimistic-session-handler

快速释放会话锁的会话处理器。适用于同一页面上的多个ajax调用。

v2.0.0 2019-11-26 10:39 UTC

This package is auto-updated.

Last update: 2024-08-26 21:13:51 UTC


README

Latest Stable Version Latest Unstable Version License Build Status

OptimisticSessionHandler

PHP 基于文件的会话处理器,快速释放会话锁。适用于加速同一页面上的多个Ajax调用。

为什么我们需要这个会话处理器?

它提高了在项目中有多个长时间运行的Ajax请求时的性能。由于会话不会长时间锁定,服务器可以同时执行多个使用用户会话的请求。

默认情况下,PHP 将会话文件写入磁盘。当您执行 session_start 时,会话文件被打开,并对该文件加锁。如果另一个进程尝试执行 session_start,该进程将等待直到会话文件的锁被释放。这是PHP的一个安全特性(2个进程不能同时修改同一个会话),但这对性能来说是可怕的,因为共享同一会话的PHP请求必须按顺序执行。

此包提供了一种绕过此问题的方法。它假设“一切都会顺利”(因此得名“乐观”),并允许多个进程同时访问会话。如果有两个进程同时修改会话,它将尝试合并两个结果。如果它无法这样做,它将抛出一个异常。

它是如何工作的?

此会话处理器修改了PHP会话处理的默认行为。会话仍然写入磁盘(就像PHP默认那样)。在调用 session_start() 以填充全局变量 $_SESSION 时打开和读取会话。但会话立即关闭。在您的PHP脚本结束时,$_SESSION 与旧会话进行比较。如果您的脚本中会话已被修改,处理器将重新打开会话并将新会话与您的更改进行比较。合并后的会话被保存。

注意:如果您使用替代会话处理器(如APC或Memcache),则不要使用此会话处理器。它旨在与基于文件的会话一起使用。

## 使用会话处理器 使用它非常简单。只需声明一个新的实例

$handler = new OptimisticSessionHandler();

并将其保存为您的默认会话处理器

session_set_save_handler($handler, true);

然后您可以像通常一样启动会话

session_start(['read_and_close' => true]);

然后 $_SESSION 数组即可访问。

您可以为管理冲突添加规则。只需将元素添加到类参数 $conflictRules。可能的规则有

  • IGNORE => 不使用当前更改。
  • OVERWRITE => 使用当前更改。
  • FAIL => 抛出异常。

因此,您可以声明一个新的实例如下

$handler = new OptimisticSessionHandler(array("key_to_override" => OptimisticSessionHandler::OVERRIDE));

销毁会话

警告:不能通过 session_destroy() 销毁会话(它将抛出错误)。要销毁会话,您必须清空 $_SESSION 数组。

$_SESSION = array();

如果您想了解更多关于此包的信息,请访问 OptimisticSessionHandler: A New Way To Think PHP Sessions