Php 如何在Symfony 2中缓存?

Php 如何在Symfony 2中缓存?,php,caching,symfony,Php,Caching,Symfony,我需要使用Symfony 2的缓存系统缓存一些特定于应用程序的数据,以便运行cache:clear来清除它。所有缓存都依赖于app/cache,但我实际上如何缓存数据呢 我看到的唯一一个主题是关于使用Varnish的HTML缓存。Symfony2中没有部分缓存,内置缓存仅为完整的HTTP缓存。 您必须使用反向代理,如果您只想缓存一段代码,则必须使用ESI。这可能比symfony 1需要更多的工作,但性能值得 无论如何,没有什么能阻止你使用memcached并在其中存储一些东西,比如。 如果正如

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


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

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

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

如果您正在使用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));
}

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

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

$cache = $this->get('memcached_cache');
要发送其他服务,请使用呼叫:

或论点:

arguments:
    - @memcached_cache
同样,您可以使用Doctrine Cache包的其他接口。 条令缓存提供了一个非常简单的接口,提供了几种现成的实现:

  • ApcCache(需要ext/apc)
  • ArrayCache(内存中,请求的生存期)
  • FilesystemCache(对于高并发性而言不是最佳选择)
  • MemcacheCache(需要ext/memcache)
  • MemcachedCache(需要ext/memcached)
  • PhpFileCache(对于高并发性而言不是最佳选择)
  • RedisCache.php(需要ext/phpredis)
  • wincache.php(需要ext/wincache)
  • XcacheCache.php(需要ext/xcache)
  • ZendDataCache.php(需要Zend服务器平台)
如果您尚未使用条令,您可能需要条令项目的公共库
php composer.phar需要条令/Common
或只需要缓存库,为许多缓存后端提供面向对象的API
php composer.phar需要条令/cache


如何使用您可以在上阅读的条令缓存Symfony2不提供任何应用层缓存组件

正如已经告诉您的,您可以使用Common caching库


如果您想要更高级的东西,还可以使用社区提供的缓存包之一。例如,提供了用于良好缓存策略的工具。

Symfony 3.1提供了一个新的。

Symfony2也可以通过ESI实现在内部执行此缓存。一开始它可能看起来有点复杂,但它使使用Varnish进行缩放的步骤小得多。@Louis Philippehuberdou我感兴趣的是缓存特定于应用程序的数据,而不是模板/HTML。我感兴趣的是缓存特定于应用程序的数据,如计算昂贵的结果等。我已经在APC上缓存了它们,但是有两个不同的缓存系统有什么意义呢?我现在还需要清除两个缓存,虽然我自己做了一个命令来清除这两个缓存,但仍然如此。据说APC在用作操作码缓存时不应用于缓存数据(如来自DB),因为它会影响其性能。为什么要对自定义数据存储使用单独的缓存,这是有道理的。如果我不使用Doctrine呢?为什么这是教义的一部分?@Tower仍然没有答案?这是教义的一部分\普通。不要将其与ORM、DBAL等混淆。“Doctrine Common project是一个为核心PHP功能提供扩展的库。”有没有办法设置一个时间?@FrancisGonzales
save
方法需要第三个
生命周期
参数:非常感谢您的回答,它终于起作用了,我只是在YAML上有一个小错误,似乎@memcached需要引号-[setMemcached,['@memcached']](我使用的是symfony 3.0)
calls:
    - [ setCacheProvider, [@memcached_cache] ]
arguments:
    - @memcached_cache