【问题标题】:How to cache in Symfony 2?如何在 Symfony 2 中缓存?
【发布时间】:2012-02-12 03:58:41
【问题描述】:

我需要使用 Symfony 2 的缓存系统缓存一些特定于应用程序的数据,以便我可以运行 cache:clear 来清除它。所有的缓存都依赖于app/cache,但是我该如何去缓存数据呢?

http://symfony.com/doc/current/cookbook/index.html

我看到的唯一主题是关于使用 Varnish 进行 HTML 缓存。

【问题讨论】:

  • Symfony2 也可以通过 ESI 实现在内部进行这种缓存。一开始可能看起来有点复杂,但它使使用 Varnish 进行缩放的步骤要小得多。
  • @Louis-PhilippeHuberdeau 我对缓存应用程序特定数据感兴趣,而不是模板/HTML。

标签: php caching symfony


【解决方案1】:

Symfony 3.1 提供了一个新的Cache component

【讨论】:

    【解决方案2】:

    Symfony2 没有为应用层缓存提供任何组件。

    就像你已经被告知的那样,你可以使用 Doctrine Common 缓存库http://docs.doctrine-project.org/projects/doctrine-common/en/latest/reference/caching.html

    如果您想要更高级的东西,您还可以使用社区提供的缓存包之一。例如,https://github.com/TheBigBrainsCompany/TbbcCacheBundle#cachebundle 为良好的缓存策略提供了工具。

    【讨论】:

      【解决方案3】:

      使用 Doctrine 缓存提供程序的简单方法。 首先,注册服务(config.yml中的示例):

      services:
          memcached:
              class: Memcached
              calls:
                  - [ addServer, ['localhost', 11211] ]
          memcached_cache:
              class: Doctrine\Common\Cache\MemcachedCache
              calls:
                  - [ setMemcached, [@memcached] ]
      

      然后使用get服务,例如在controler中:

      $cache = $this->get('memcached_cache');
      

      发送另一个服务使用调用

      calls:
          - [ setCacheProvider, [@memcached_cache] ]
      

      或参数:

      arguments:
          - @memcached_cache
      

      同样可以使用Doctrine Cache包的其他接口。 Doctrine Cache 提供了一个非常简单的接口,提供了几个开箱即用的实现:

      • ApcCache(需要 ext/apc)
      • ArrayCache(在内存中,请求的生命周期)
      • FilesystemCache(不适合高并发)
      • MemcacheCache(需要 ext/memcache)
      • MemcachedCache(需要 ext/memcached)
      • PhpFileCache(不适合高并发)
      • RedisCache.php(需要 ext/phpredis)
      • WinCacheCache.php(需要 ext/wincache)
      • XcacheCache.php(需要 ext/xcache)
      • ZendDataCache.php(需要 Zend 服务器平台)

      如果你还没有使用 Doctrine,你可能需要 Common Library for Doctrine 项目php composer.phar require doctrine/common 或只需要 提供面向对象的缓存库许多缓存后端的 APIphp composer.phar require doctrine/cache

      如何使用 Doctrine Caching 您可以在 Doctrine Common documentation 上阅读 Doctrine Project web site

      【讨论】:

      • 非常感谢您的回答,它终于可以工作了,我只是在 YAML 上出现了一点错误,似乎@memcached 需要引号 - [ setMemcached, ['@memcached'] ](我' m 使用 symfony 3.0)
      【解决方案4】:

      如果您正在使用 Doctrine,则只需使用这些缓存类。

      config.yml添加服务:

      services:
          cache:
              class: Doctrine\Common\Cache\ApcCache
      

      并在您的控制器中使用它:

      if ($fooString = $this->get('cache')->fetch('foo')) {
          $foo = unserialize($fooString);
      } else {
          // do the work
          $this->get('cache')->save('foo', serialize($foo));
      }
      

      【讨论】:

      • 如果我不使用 Doctrine 怎么办?为什么这是教义的一部分?
      • @Tower 仍然没有答案?
      • 这是 Doctrine\Common 的一部分。不要将此与 ORM、DBAL 等混淆。“Doctrine Common 项目是一个为核心 PHP 功能提供扩展的库。”
      • 有没有办法设置时间?
      • @FrancisGonzales save 方法采用第三个lifetime 参数:doctrine-project.org/api/common/2.0/…
      【解决方案5】:

      Symfony2 中没有部分缓存,内置缓存只有完整的 HTTP。 你必须使用反向代理,如果你只想缓存一段代码,你必须使用 ESI。这可能比使用 symfony 1 做更多的工作,但性能值得。

      无论如何,没有什么能阻止你使用 memcached 并在其中存储一些东西,看at this Bundle 即 如果如您的问题所述,您只有要存储的数据,那是完美的(而且 memcache 缓存比文件系统缓存快得多)。

      【讨论】:

      • 我对缓存特定于应用程序的数据感兴趣,例如计算量大的结果等。我已经在 APC 上缓存它们,但是拥有 2 个不同的缓存系统有什么意义呢?我现在还需要清除两个缓存,虽然我自己做了一个命令来清除两个缓存,但仍然。
      • 据说 APC 在用作操作码缓存时不应该用于缓存数据(例如来自 DB),因为它会影响其性能。为什么要使用单独的缓存来存储自定义数据是有道理的。
      猜你喜欢
      • 2013-11-20
      • 2015-01-08
      • 2015-11-30
      • 2013-03-26
      • 2011-01-28
      • 1970-01-01
      • 1970-01-01
      • 2016-05-09
      • 1970-01-01
      相关资源
      最近更新 更多