Кэш приложения/консоли: очистка не очищает 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 после повторного развертывания (никоим образом, но сложный путь, наши сисопы убьют меня за эту идею).
Да, мы на самом деле решили использовать Memcache в качестве нашего кэш-уровня результата (он уже есть и работает отлично). Но для кэширования метаданных объекта и преобразований DQL> SQL xcache вполне достаточно. Основная проблема заключается в том, что мы используем кеш-класс: он будет хранить старые определения, если мы не будем его смывать. Я не думаю, что вы можете (должны) кэшировать код операции в Redis, не так ли?) – Stefan
Тогда я бы пошел на перезапуск php-fpm (или Apache в вашем случае). Конечно, нет redis для кода операции :) –
скажите, что наш администратор, который по-прежнему считает, что вы не должны перезапускать свой веб-сервер :( – Stefan