【问题标题】:Aggressive caching of generated contents while maintaining auth info在维护身份验证信息的同时积极缓存生成的内容
【发布时间】:2011-05-30 14:01:26
【问题描述】:

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

【问题讨论】:

  • TFM 似乎有一些不错的信息 - symfony.com/doc/current/book/http_cache.html - 在我看来 AppCache 有你需要的所有好东西,可能只需要检查请求是否经过身份验证,或者之前是非公共资源缓存响应。
  • 那解决不了他的问题。他希望缓存 MySQL 的查询而不是 HTTP 请求。

标签: php caching symfony


【解决方案1】:

简单来说,就是使用 Memcache 将 SQL 结果集缓存一段时间。

【讨论】:

    【解决方案2】:

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

    创建几组页面,一组用于尚未认证用户(让我们放入站点根目录),另一组用于已认证用户应该看到相同内容(例如,两个或多个在认证时应该看到相同的内容,那么我们将为它们创建一个集合),并将其放入根目录下。然后为每个这样的“for-authed-only”目录形成简单的 .htaccess/.htpasswd 文件,然后这将是网络服务器的问题,而不是你的脚本。

    希望你明白了。说起来很模糊,但很容易实现。

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

    【讨论】:

      【解决方案3】:

      如果你使用 Symfony2,你就是在使用 Doctrine2 如果您使用 Doctrine2,则应默认启用缓存。

      根据您的目的选择缓存驱动程序,应该没有问题。 您可能还对query result caching 特别感兴趣。

      不要使用没有元数据和查询缓存的 Doctrine!教义是 高度优化以使用缓存。教义的主要部分 为缓存优化的是元数据映射信息 使用元数据缓存和使用查询的 DQL 到 SQL 转换 缓存。这 2 个缓存只需要绝对最小的内存 它们极大地提高了 Doctrine 的运行时性能。这 推荐与 Doctrine 一起使用的缓存驱动程序是 APC。 APC 为您提供 带有一个操作码缓存(无论如何都强烈推荐)和一个非常 可用于元数据和 查询缓存

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          看来您有很多使用 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
          

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

          【讨论】:

            猜你喜欢
            • 2010-09-29
            • 1970-01-01
            • 2012-03-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-01-27
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多