2013-11-27 2 views
0

Кэш приложения/консоли: очистка не очищает XCache (или APC), что может привести к серьезным проблемам после перераспределения при использовании AppCache в app.php (например, bootstrap.php .cache и все другие созданные файлы .cache. кэшируются).Symfony2: кеш класса Flush XCache при развертывании

app.php (довольно по умолчанию)

$loader = require_once __DIR__.'/../app/bootstrap.php.cache'; 
$loader = new \Symfony\Component\ClassLoader\XcacheClassLoader('sf2dc4', $loader); 
$loader->register(true); 
require_once __DIR__.'/../app/AppKernel.php'; 
require_once __DIR__.'/../app/AppCache.php'; 

$kernel = new AppKernel('prod', false); 
$kernel->loadClassCache(); 
$kernel = new AppCache($kernel); 
Request::enableHttpMethodParameterOverride(); 
$request = Request::createFromGlobals(); 
$response = $kernel->handle($request); 
$response->send(); 
$kernel->terminate($request, $response); 

Наша установка распределяется между 4 «приложения» серверов, так что нет никакого способа, чтобы надежно очистить кэш на повторное развертывание. Нам понадобится способ рассказать всем серверам в нашей среде, чтобы очистить их PHP/XCache. APCBundle https://github.com/ornicar/ApcBundle, похоже, идет таким образом, но работает только для APC.

Связанная с этим проблема заключается в использовании команд doctrine:cache:clear-query или clear-metadata. Когда мы используем XCache в качестве реализации кэша для метаданных ORM, эти команды на самом деле вообще ничего не смывают, даже если они пишут «Очистка всех записей кэша метаданных Успешно удаленные записи кэша». -> взгляд в администратор XCache показывает, что все еще есть. Это на самом деле ожидается, поскольку команды Symfony запускаются в среде CLI PHP. Опять же, APC Bundle правильно очистит кеши.

a) это «ошибка», что команды говорят, что все было покраснело или нам что-то не хватает? б) Как мы можем надежно сбросить эти кеши на всех наших серверах? c) Кто-нибудь написал аналогичное решение, подобное APCBundle, и может придумать, как справиться с этими проблемами? d) возможно ли перезапустить каждый Apache после повторного развертывания (никоим образом, но сложный путь, наши сисопы убьют меня за эту идею).

ответ

2

Если у вас есть несколько экземпляров, вы должны использовать централизованное хранилище кэш-памяти (например, Redis через SncRedisBundle для сохранения сессий, метаданных доктрины и кеша запросов). Таким образом, вам нужно будет очистить метаданные доктрины или кеш запросов один раз в качестве последнего шага в процессе развертывания.

Существует несколько стратегий развертывания, но во всех их случаях перезапуск Apache будет делать трюк. Хотя есть много альтернатив в отношении того, как вы это делаете :) Вы можете обменивать экземпляры, у которых есть старый код с экземплярами, у которых есть новый код (кэширование кавычек и разминки). В качестве альтернативы (если вы используете load-balancers), вы можете добавлять новые экземпляры в группу и удалять старые экземпляры.

По моему опыту перезапуск php-fpm (я не использую Apache уже несколько лет) быстро очистит APC, и он работает очень стабильно, также нет простоев вообще.

Не стесняйтесь спрашивать меня, есть ли еще вопросы.

+0

Да, мы на самом деле решили использовать Memcache в качестве нашего кэш-уровня результата (он уже есть и работает отлично). Но для кэширования метаданных объекта и преобразований DQL> SQL xcache вполне достаточно. Основная проблема заключается в том, что мы используем кеш-класс: он будет хранить старые определения, если мы не будем его смывать. Я не думаю, что вы можете (должны) кэшировать код операции в Redis, не так ли?) – Stefan

+1

Тогда я бы пошел на перезапуск php-fpm (или Apache в вашем случае). Конечно, нет redis для кода операции :) –

+0

скажите, что наш администратор, который по-прежнему считает, что вы не должны перезапускать свой веб-сервер :( – Stefan

Смежные вопросы