13

在我的项目的管理面板中,我编写了更改要使用的数据库名称的功能。我在 中写入了新的数据库名称parameters.ini,之后必须清理缓存以加载新配置。

在不运行控制台命令的情况下清理缓存的最佳方法是什么?

或者是否有另一种最佳实践如何更改当前数据库。

4

7 回答 7

16

您可以通过以下方式使用控制台命令exec()

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

或者,如果您不想使用控制台命令,则 只需清空cache/文件夹。

于 2012-05-30T12:19:54.717 回答
10

您可以调用此操作来清除缓存:

/**
 * @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);
   }
于 2013-09-03T11:46:37.193 回答
4

最近的最佳方式(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);
}
于 2017-04-23T07:01:38.827 回答
1

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 中配置,你会丢失会话。

于 2014-09-25T12:29:01.340 回答
1

@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 或其他东西,您不希望管理员以外的任何人都能够清除缓存。

于 2017-06-07T12:16:01.813 回答
0

我正在以这种方式清除缓存:

$fs = new Filesystem();
$fs->remove($this->getParameter('kernel.cache_dir'));

https://gist.github.com/basdek/5501165

于 2017-06-25T18:27:10.367 回答
-1

尽管他的回答或多或少已经过时,但他的建议在今天仍然有用:

答案非常简单。

所有缓存文件都存储在项目根目录中的单个 cache/ 目录中。

因此,要清除缓存,您只需删除 cache/ 下的所有文件和目录。symfony 足够聪明,可以在它不存在的情况下重新创建它需要的目录结构。

Fabien Potencier2007 年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函数的用户贡献说明,就有很多建议

于 2018-02-17T13:55:30.763 回答