Я пытаюсь очистить кэш Symfony 2 через мое приложение так же, как если бы я делал php app/console cache:clear
.
Я пробовал много разных решений, таких как:
//solution 1 $process = new Process('php '.__DIR__.'/../../../../../app/console cache:clear'); $process->setTimeout(3600); $process->run(); //solution 2 $input = new StringInput(null); $output = new NullConfigurationOutput(); $command = new CacheClearCommand(); $command->setContainer($container); $command->run($input, $output); //solution 3 $container->get('cache_clearer')->clear($container->getParameter('kernel.cache_dir'));
Я также попытался установить rm -Rf
в папку кэша.
Ни один из них не работает полностью, так как я получаю много ошибок. Следующая ошибка – это то, что я получаю на решении 2 (что показалось лучшим):
Не удалось запустить сеанс: уже запущен PHP (устанавливается $ _SESSION).
Похоже, что Symfony пытается перестроить страницу или перезагрузить приложение во время процесса рендеринга.
Как кто-то может очистить кеш через некоторый php-код?
EDIT: Я на самом деле пытаюсь восстановить кеш из-за моей системы маршрутизации. Я сделал пакет, который берет маршрут symfony 2 и добавляет возможность переписать его для цели SEO (например: у меня есть маршрут front_category, который указывает на / категорию, с этим пакетом я могу переписать его в категорию-оптимизированный для seo-оптимизации. HTML).
Если я на маршруте, который нуждается в определенном параметре, таком как идентификатор, мне нужно сделать для него специальный маршрут, чтобы переписать его. Например, для / category / 3 мне нужно создать маршрут с именем category_3 и .., чтобы Symfony знал, что я изменил систему маршрутизации, мне пришлось очистить кеш.
Точно такая же проблема, что и у меня. Самое простое решение для меня было:
use Symfony\Component\Filesystem\Filesystem;
и в контроллере:
$fs = new Filesystem(); $fs->remove($this->container->getParameter('kernel.cache_dir'));
Это приведет к удалению каталога кэша для текущей среды.
На подобный вопрос уже ответили: Symfony 2.4 выполняет команду от Controller, – ответил 20 марта в 15:37 pomaxa.
Я проверил и расширил код pomaxa :
Код контроллера
use Symfony\Component\Console\Input\ArgvInput; use Symfony\Component\Console\Output\ConsoleOutput; $command = $this->container->get('yourservice.cache.clear'); //$dynamicEnvMode = $this->container->getParameter('kernel.environment') $staticEnvMode = 'dev'; // to use develop mode $staticEnvMode = 'prod --no-debug'; // to use production mode $input = new ArgvInput(array('--env=' . $staticEnvMode )); $output = new ConsoleOutput(); $command->run($input, $output);
Я использовал статический режим среды, и я попытался использовать объект CacheClearCommand вместо службы, но он не сработал. Операция очистки кеша может использовать длительное время для загрузки, поэтому использование службы может сделать это лучше.
Лучший способ – решить вашу проблему без очистки кеша. Найдите быстро меняющиеся объекты, действия или все, что вам нужно, и отключите кеширование для них. Если вы публикуете подробный вопрос (и помещаете ссылку в комментарии), почему вам нужно игнорировать кеш и где, то я мог бы помочь вам найти другой способ.