【问题标题】:Using 'master session' for site-wide cache使用“主会话”进行站点范围的缓存
【发布时间】:2014-08-19 11:30:58
【问题描述】:

我一直想为我的网站添加一个缓存功能,该功能在多个用户会话之间持续存在。这个想法是能够存储频繁执行的查询的结果,或者也不会经常更改的计算。我的主要用途是当用户访问我的网站时,会运行查询以查找他们请求的页面。页面很少更改,所以我想为每个用户将此结果缓存 2-4 小时,这样查询就不必在每个用户的每个页面加载时一遍又一遍地运行。

我所做的是一个 PHP 对象,它存储当前 session_id 并且每当对缓存对象进行读取或写入时,它会使用 session_write_close() 关闭会话,并使用硬编码的 session_id 读取/写入开始一个新会话到/从这个硬编码的“主”会话,然后在 session_write_close() 主会话之后恢复到原始 session_id。

谁能想到这种方法有什么问题?我想避免使用像 memecache 这样过于复杂的东西,所以我认为这很简单,而且似乎工作得很好!

我们将不胜感激有关方法的想法和其他想法!

【问题讨论】:

  • 这个问题对于这个网站来说有点宽泛。
  • 很公平,我阅读了指南并认为它仍然适用,但第一次发布,所以生活和学习!
  • 我很高兴在这里找到了这个。这似乎是在会话之间共享实际 PHP 对象的唯一可能性。我尝试了 memcache,但我需要一个迭代缓存的键/值的可能性。使用这种方法应该可以做到这一点。

标签: php session caching


【解决方案1】:

这个解决方案听起来比简单地使用 Memcache 更复杂。

我对这个解决方案的主要问题是您使用 Session 来存储缓存文件。 PHP 默认将会话存储在文件中,您无需关闭和打开会话。以下是一种更简单的方法,您可以通过更好的性能完成完全相同的任务:

  1. 使用filemtime() 检查您的缓存文件是否超过 2 小时:

    if(filemtime($cache_file) > time()-3600*2)
    
  2. 如果您创建 PHP 缓存对象并使用 file_put_contents()serialize() 将其写入缓存文件:

    file_put_contents($cache_file, serialize($cache_object))
    
  3. 如果文件小于 2 小时,则使用 file_get_contents()unserialize() 检索 PHP 缓存对象

    $cache_object = unserialize(file_get_contents($cache_file))
    

【讨论】:

  • 我喜欢这个,目前正在尝试。但是,我认为 file_put_contents 的参数反过来是正确的:file_put_contents($cache_file, serialize($cache_object))(根据php.net/manual/de/function.file-put-contents.php
  • 确实,切换的参数现在已修复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-17
  • 2016-10-04
  • 2012-08-28
  • 1970-01-01
  • 2012-02-23
相关资源
最近更新 更多