在维护身份验证信息的同时积极缓存生成的内容


Aggressive caching of generated contents while maintaining auth info

我使用Symfony 2从MySQL数据库中的数据生成页面。对于大多数内容,用户必须经过身份验证,但内容本身不会经常更改,也不需要为用户定制。那么,在保持身份验证检查的同时,有什么好的缓存策略可以避免数据库调用呢?

简单地说,使用Memcache来缓存SQL结果集一段较长的时间。

也许这是一个太大的变化,但以下方案可能在这种情况下有用:

创建多组页面,一组用于尚未通过身份验证的用户(让我们放在站点根目录中),另一组用于应该看到相同内容的已通过身份验证的用户(例如,当他们通过身份验证时,两个或多个用户应该看到相同的内容,然后我们只为所有用户创建一组),并将其放在根目录下的目录中。然后为每个这样的"仅用于身份验证"目录形成简单的.htaccess/.htpasswd文件,然后这将是Web服务器的问题,而不是脚本的问题。

希望你有这个想法。它说起来很模糊,但实施起来很容易。

示例:表示只允许经过身份验证的用户在网站上查看页面"/topsecret.html"。创建dir(/authed),在其上建立HTTP auth,并将您的topsecret.html放入该目录中(因此它将是"/authd/topsecret.html")。现在编辑"/topsecret.html"并简单地将其主要内容替换为"对不起,请验证您自己"链接,该链接将指向"/authed/topsecret.html"。

如果使用Symfony2,则表示使用的是Doctrine2如果使用Doctrine2,则默认情况下应启用缓存。

根据您的目的选择缓存驱动程序,应该不会有任何问题。您可能还对查询结果缓存特别感兴趣。

不要在没有元数据和查询缓存的情况下使用Doctrine!条令是针对高速缓存进行了高度优化。学说的主要部分为缓存而优化的是元数据映射信息使用元数据缓存和查询的DQL到SQL转换隐藏物这两个缓存只需要绝对最小的内存它们极大地提高了条令的运行时性能。这个建议与条令一起使用的缓存驱动程序是APC。APC为您提供带有操作码缓存(无论如何都强烈建议使用)和可用于元数据和查询缓存

我通过在可缓存操作中使用Zend_Cache来存储渲染的模板结果来解决这个问题。然后,我从缓存的内容中创建一个新的Response对象。如果缓存为空,我将生成内容。

我想过创建一个插件来检查注释并自动存储响应输出,但事实证明,我只有3-4个可缓存的显示操作,并且具有非常复杂的缓存ID创建规则,所以我将缓存逻辑直接放入控制器代码中。

似乎有很多使用symfony缓存的选项http://www.symfony-project.org/book/1_2/12-Caching(不是2,但我猜变化不大)。

您可以将繁重的sql语句放在自己的脚本中,并为该脚本打开缓存

list:
  enabled:     on
  with_layout: false   # Default value
  lifetime:    86400   # Default value

此外,如果你确信生成的标签在一段时间内不会更改,你可以使用symfony告诉用户的浏览器,甚至不要为内容打扰你的服务器,因为这会导致页面几乎不稳定地为用户加载。

$this->getResponse()->addCacheControlHttpHeader('max_age=1200'); // in seconds - less than 1 year seconds

只要确保你的最大年龄足够小,当某些事情发生变化(比如代码更新)时,用户不会被旧页面卡住,因为除了更改url之外,没有办法强迫他们再次请求该页面。