我正在使用Symfony 2从MySQL数据库中的数据生成我的页面。对于大多数内容,用户必须经过身份验证,但内容本身不会经常更改,也不需要为用户进行自定义。那么,在保持身份验证的同时避免数据库调用的缓存策略是什么?
答案 0 :(得分:1)
简单地说,使用Memcache在较长时间内缓存SQL结果集。
答案 1 :(得分:0)
这可能是一个太大的变化,但以下方案在这种情况下可能会有用:
创建几组页面,一组用于 not-yet-authed 用户(让我们放入站点根目录),另一组用于经过身份验证的用户,这些用户应该看到相同的页面内容(比如,两个或更多内容在进行身份验证时应该看到相同的内容,然后我们只为它们创建一个集合),并将其放在root下的目录中。然后为每个这样的'for-authed-only'目录形成简单的.htaccess / .htpasswd文件,然后它将是webserver的问题,而不是你的脚本。
希望你明白了。说的很模糊,但很容易实现。
示例:假设您只允许经过身份验证的用户在网站上看到“/topsecret.html”页面。创建目录(/ authed),在其上建立HTTP-auth,并将你的topsecret.html放入目录(所以它将是'/authed/topsecret.html')。现在编辑'/topsecret.html'并简单地将其主要内容替换为'抱歉,请自我验证'链接,该链接指向'/authed/topsecret.html'。
答案 2 :(得分:0)
我通过在可缓存操作中使用Zend_Cache来解决这个问题,以存储渲染的模板结果。然后,我从缓存的内容中创建一个新的Response
对象。如果缓存为空,我会生成内容。
我想过创建一个插件来检查注释并自动存储Response输出,但事实证明我只有3-4个可缓存的显示操作,并且具有非常复杂的缓存ID创建规则,所以我把缓存逻辑直接进入控制器代码。
答案 3 :(得分:-1)
看来你有很多用symphony 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
只需确保您的最大年龄足够小,以便当某些内容发生变化(例如代码更新)时,用户不会被旧页面卡住,因为无法再强迫他们再次请求该页面网址。