将PHP会话变量分离到它们自己的文件中


Separating PHP session variables into their own files

我正在考虑编写一个会话处理程序(使用session_set_save_handler),它将每个会话变量存储在自己的文件中。也许我会把session_id作为一个目录,每个变量都存储在自己的文件中,会话密钥作为文件名。

我的目的是:

  • 非阻塞(或较少阻塞)会话。也就是说,当你运行一个打开会话的脚本时,在另一个脚本可以写入会话之前,你不必关闭会话。我认为会话处理程序可以快速打开和关闭单个文件进行写访问(读访问是可以的,因为您可以关闭会话,但仍然使用$_session访问值)。因此,基本上要写入任何给定的会话变量,脚本不需要锁定整个会话
  • 该应用程序的数据库已经很重了(它是生物学研究实验室的中心数据库),因此我不想通过将用户的会话存储在数据库中来给数据库增加额外的负载(尽管这是一种替代方案,甚至可能为会话设置一个额外的数据库?)。当用户的表单输入使用ajax保存到会话中时(为了持久性,在更改时),会话会被大量使用,并且任何给定表单都可以有多个实例
  • 方便会话上的垃圾收集/过期例程,而无需过度锁定

有人对存储这样的会话有意见吗?这是个好主意吗?坏主意?

我建议您避免自己写东西,而是实现一个已经尝试和测试过的解决方案。

以下解决方案符合您在问题中提出的标准:

http://silex.sensiolabs.org/doc/cookbook/session_storage.html

如果您的应用程序已经像您所说的那样大量使用数据库,我建议您创建一个单独的数据库,纯粹用于存储和读取会话,正如您已经承认的那样。

为了进行设置,您必须下载使用Symfony2组件的Silex。我建议在您的网站上设置Silex的最佳方式是使用Composer。为了简洁起见,我将不介绍Composer的安装和设置,因为有很多关于如何做到这一点的有用文章。

你不必使用Silex附带的所有东西,但如果你选择走这条路,拥有Silex类库可能也有利于其他用途。

有关设置Silex的说明,请访问以下位置:

http://silex.sensiolabs.org/doc/usage.html

以下链接提供了有关配置会话的更多信息,以及如何使用会话的示例,但页面上提到使用了文件存储,您可以忽略与文件存储有关的任何内容:

http://silex.sensiolabs.org/doc/providers/session.html

尽管满足了您指定的要求,但如果您不考虑推荐的解决方案,请解释原因,我将在需要时提供额外的帮助和支持。