Как кэшировать в Symfony 2?


Мне нужно кэшировать некоторые данные, относящиеся к конкретному приложению, с помощью системы кэширования Symfony 2, чтобы я мог запустить cache:clear для их очистки. Весь кэш зависит от app/cache, но как мне на самом деле кэшировать данные?

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

Единственная тема, которую я вижу, касается кэширования HTML с помощью Varnish.

Author: j0k, 2012-01-17

5 answers

Если вы уже используете доктрину, просто используйте эти классы кэша.

Добавить службу в 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));
}
 78
Author: Kris Wallsmith, 2012-01-17 19:12:15

Простой способ использования Поставщиков кэша доктрины . Сначала зарегистрируйте службу (пример в config.yml):

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

Затем, чтобы использовать службу get, например, в контроллере:

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

Для отправки в другую службу используйте вызовы:

calls:
    - [ setCacheProvider, [@memcached_cache] ]

Или аргументы:

arguments:
    - @memcached_cache

Таким же образом вы можете использовать другие интерфейсы пакета кэша доктрины. Кэш доктрины предоставляет очень простой интерфейс, для которого доступно несколько готовых реализаций предоставлено:

  • APCCACHE (требуется ext/apc)
  • Кэш массива (в памяти, время жизни запроса)
  • Файловый системный кэш (не оптимальный для высокой параллельности)
  • Кэш памяти (требуется ext/memcache)
  • Кэш-память (требуется ext/memcached)
  • Кэш phpfilecache (не оптимальный для высокой параллельности)
  • RedisCache.php (требуется ext/phpredis)
  • WinCacheCache.php (требуется ext/wincache)
  • XcacheCache.php (требуется ext/xcache)
  • ZendDataCache.php (требуется серверная платформа Zend)

Если вы еще не используете Доктрину , вам может потребоваться Общая библиотека для проектов Доктрины: php composer.phar require doctrine/common или требуется только Библиотека кэширования, предлагающая объектно-ориентированный API для многих бэкендов кэша: php composer.phar require doctrine/cache

Как использовать кэширование доктрины вы можете прочитать в Общей документации доктрины на веб-сайте проекта Доктрины

 33
Author: Максим Шатов, 2013-07-29 12:13:15

Symfony 3.1 предоставляет новый компонент кэша .

 10
Author: Alsatian, 2016-08-01 11:03:02

Symfony2 не предоставляет никаких компонентов для кэширования прикладного уровня.

Как вам уже говорили, вы можете использовать общую библиотеку кэширования доктрины http://docs.doctrine-project.org/projects/doctrine-common/en/latest/reference/caching.html

Если вам нужно что-то более продвинутое, вы также можете использовать один из пакетов кэша, предоставленных сообществом. Например, https://github.com/TheBigBrainsCompany/TbbcCacheBundle#cachebundle который обеспечивает инструменты для хорошей стратегии кэширования.

 8
Author: Benjamin, 2014-04-23 07:44:47

В Symfony2 нет частичного кэша, встроенный кэш заполнен только по протоколу HTTP. Вы должны использовать обратный прокси-сервер, и если вы хотите кэшировать только фрагмент кода, вы должны использовать ESI. Это, возможно, больше работы, чем с symfony 1, но производительность того стоит.

В любом случае, ничто не мешает вам использовать memcached и хранить в нем некоторые вещи, посмотрите на этот пакет, т. е. Если, как указано в вашем вопросе, у вас есть только данные для хранения, это идеально (и кэш memcache намного быстрее, чем файловая система номер один).

 0
Author: Damien, 2012-01-17 17:07:52