在我的项目的管理面板中,我编写了更改要使用的数据库名称的功能。我在 中写入了新的数据库名称parameters.ini
,之后必须清理缓存以加载新配置。
在不运行控制台命令的情况下清理缓存的最佳方法是什么?
或者是否有另一种最佳实践如何更改当前数据库。
您可以通过以下方式使用控制台命令exec()
:
exec("php /my/project/app/console cache:clear --env=prod");
或者,如果您不想使用控制台命令,则 只需清空cache/文件夹。
您可以调用此操作来清除缓存:
/**
* @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);
}
最近的最佳方式(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);
}
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 中配置,你会丢失会话。
@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 }
现在,您可以在 twig 模板中使用 {{ output }} 输出命令的结果。
如果您有访问控制,不要忘记将此路由的权限设置为 SUPER_ADMIN 或其他东西,您不希望管理员以外的任何人都能够清除缓存。
我正在以这种方式清除缓存:
$fs = new Filesystem();
$fs->remove($this->getParameter('kernel.cache_dir'));
尽管他的回答或多或少已经过时,但他的建议在今天仍然有用:
答案非常简单。
所有缓存文件都存储在项目根目录中的单个 cache/ 目录中。
因此,要清除缓存,您只需删除 cache/ 下的所有文件和目录。symfony 足够聪明,可以在它不存在的情况下重新创建它需要的目录结构。
Fabien Potencier,2007 年11 月 3 日
因此,按照他的建议,我编写了一个函数来做到这一点:
/**
* @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('...');
}
wheredelTree($dir_name)
可以是递归删除目录树的任何函数。只需查看 PHPrmdir
函数的用户贡献说明,就有很多建议。