Как кэшировать в Symfony 2?
Мне нужно кэшировать некоторые данные, относящиеся к конкретному приложению, с помощью системы кэширования Symfony 2, чтобы я мог запустить cache:clear
для их очистки. Весь кэш зависит от app/cache
, но как мне на самом деле кэшировать данные?
Http://symfony.com/doc/current/cookbook/index.html
Единственная тема, которую я вижу, касается кэширования HTML с помощью Varnish.
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));
}
Простой способ использования Поставщиков кэша доктрины . Сначала зарегистрируйте службу (пример в 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
Как использовать кэширование доктрины вы можете прочитать в Общей документации доктрины на веб-сайте проекта Доктрины
Symfony2 не предоставляет никаких компонентов для кэширования прикладного уровня.
Как вам уже говорили, вы можете использовать общую библиотеку кэширования доктрины http://docs.doctrine-project.org/projects/doctrine-common/en/latest/reference/caching.html
Если вам нужно что-то более продвинутое, вы также можете использовать один из пакетов кэша, предоставленных сообществом. Например, https://github.com/TheBigBrainsCompany/TbbcCacheBundle#cachebundle который обеспечивает инструменты для хорошей стратегии кэширования.
В Symfony2 нет частичного кэша, встроенный кэш заполнен только по протоколу HTTP. Вы должны использовать обратный прокси-сервер, и если вы хотите кэшировать только фрагмент кода, вы должны использовать ESI. Это, возможно, больше работы, чем с symfony 1, но производительность того стоит.
В любом случае, ничто не мешает вам использовать memcached и хранить в нем некоторые вещи, посмотрите на этот пакет, т. е. Если, как указано в вашем вопросе, у вас есть только данные для хранения, это идеально (и кэш memcache намного быстрее, чем файловая система номер один).