Подтвердить что ты не робот

Каков наилучший способ очистки кеша без запуска команды консоли?

В панели администратора моего проекта я запрограммировал возможность изменения имени базы данных для использования. Я написал новое имя базы данных в parameters.ini, после чего кеш должен был быть очищен для загрузки новой конфигурации.

Каков наилучший способ очистки кеша без запуска команды консоли?

Или есть другая лучшая практика, как изменить текущий db.

4b9b3361

Ответ 1

Вы можете использовать консольную команду через exec():

exec("php /my/project/app/console cache:clear --env=prod");

Или просто очистите кеш/папку, если вы не хотите использовать консольную команду.

Ответ 2

Вы можете вызвать это действие, чтобы очистить кеш:

/**
 * @Route("/cache/clear", name="adyax_cache_clear")
 */
  public function cacheClearAction(Request $request) {
    $input = new \Symfony\Component\Console\Input\ArgvInput(array('console','cache:clear'));
    $application = new \Symfony\Bundle\FrameworkBundle\Console\Application($this->get('kernel'));
    $application->run($input);
   }

Ответ 3

Самый последний лучший способ (2017). Я создаю это в контроллере:

use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Component\Console\Output\BufferedOutput;

/**
 * Refresh Cache
 */
public function refreshRoutes()
{
    $kernel = $this->container->get('kernel');

    $application = new Application($kernel);
    $application->setAutoExit(false);

    $input = new ArrayInput([
        'command' => 'cache:clear',
        '--env'   => 'prod',
    ]);

    $output = new BufferedOutput();
    $application->run($input, $output);
}

Ответ 4

Мое действие с рендерингом страницы Success. Он очищает кеш при завершении работы.

public function clearCacheAction(Request $request)
{ 
    $dir = $this->get('kernel')->getRootDir() . '/cache';
    register_shutdown_function(function() use ($dir) {
        `rm -rf $dir/*`;
    });
    return $this->render('SomeBundle:SomePart:clearCache.html.twig');
}

Обратите внимание, что вы теряете сеансы, если вы не настроили session: в config.yml.

Ответ 5

@Ответ на HelpNeeder хорош, но команда ClearCache не использует параметр --env. Вместо этого используется текущее ядро, в котором выполняется приложение.

Итак, для того, чтобы работать с другой средой, чем среда, из которой вы вызываете контроллер, вам нужно немного настроить код (я не могу отредактировать его ответ, он говорит, что очередь редактирования заполнена), так что здесь больше полный ответ:

//YourBundle:YourController

use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Component\Console\Output\BufferedOutput;

public function clearCacheAction($env = 'dev', $debug = true)
{
    $kernel = new \AppKernel($env, $debug);

    $application = new Application($kernel);
    $application->setAutoExit(false);

    $input = new ArrayInput([
        'command' => 'cache:clear'
    ]);

    $output = new BufferedOutput();
    $application->run($input, $output);

    return $this->render('someTwigTemplateHere', array('output' => $output->fetch()));
}

Затем вы настраиваете маршруты:

cache_clear_dev:
    path:     /_cache/clear/dev
    defaults: { _controller: YourBundle:YourController:clearCache, env: 'dev', debug: true }

cache_clear_prod:
    path:     /_cache/clear/prod
    defaults: { _controller: YourBundle:YourController:clearCache, env: 'prod', debug: false }

Теперь вы можете вывести результат команды, используя {{output}} в своем шаблоне ветки.

Если у вас есть контроль доступа, не забудьте установить разрешение для этого маршрута на SUPER_ADMIN или что-то еще, вы не хотите, чтобы кто-либо, кроме администратора, мог очистить кеш.

Ответ 7

Хотя его ответ более/менее устарел, его рекомендации по-прежнему полезны сегодня:

Ответ поразительно простой.

Все файлы кэша хранятся в одном кэше/каталоге, расположенном в корневой каталог проекта.

Итак, чтобы очистить кеш, вы можете просто удалить все файлы и каталоги в кеше /. И symfony достаточно умен, чтобы воссоздать структура каталогов, в которой она нуждается, если она не существует.

Fabien Potencier, ноябрь 03, 2007

Итак, следуя его рекомендации, я написал функцию, которая делает именно это:

/**
* @Route("/cache/clear", name="maintenance_cache_clear")
*/
public function cacheClearAction(Request $request)
{
    $kernel=$this->get('kernel');

    $root_dir = $kernel->getRootDir();

    $cache_dir = $kernel->getCacheDir();

    $success = $this->delTree($cache_dir);

    return new Response('...');
}

где delTree($dir_name) может быть любой функцией, которая рекурсивно удаляет дерево каталогов. Просто проверьте функцию PHP rmdir "Заметки о вкладе пользователя", есть много предложений.