Dans le panneau d'administration de mon projet, j'ai programmé la possibilité de changer le nom de la base de données à utiliser. J'ai écrit le nouveau nom de la base de données dans le parameters.ini
, puis le cache a dû être nettoyé pour charger la nouvelle configuration.
Quel est le meilleur moyen de nettoyer le cache sans exécuter la commande de console?
Ou existe-t-il une autre bonne pratique pour changer la base de données actuelle?.
Vous pouvez utiliser la commande de console via exec()
:
exec("php /my/project/app/console cache:clear --env=prod");
Ou videz simplement le dossier cache/si vous ne souhaitez pas utiliser la commande console.
Vous pouvez appeler cette action pour vider un 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);
}
Le plus récent meilleur moyen (2017). Je crée ceci dans le contrôleur:
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);
}
Mon action de travail avec le rendu de la page Success
. Il efface le cache à l’arrêt.
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');
}
Notez que vous perdez des sessions si vous n'avez pas configuré session:
dans config.yml.
La réponse de @ HelpNeeder est bonne, mais la commande ClearCache n'utilise pas l'option --env donnée. Il utilise plutôt le noyau actuel sur lequel l'application est exécutée.
Donc, pour que cela fonctionne avec un autre environnement que celui depuis lequel vous appelez le contrôleur, vous devez modifier légèrement le code (je ne peux pas modifier sa réponse, cela signifie que la file de modification est pleine). Voici donc une réponse plus complète:
//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()));
}
Ensuite, vous configurez les itinéraires:
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 }
Et vous pouvez maintenant afficher le résultat de la commande en utilisant {{output}} dans votre modèle de brindille.
Si vous disposez d'un contrôle d'accès, n'oubliez pas de définir l'autorisation pour cette route sur un SUPER_ADMIN ou quelque chose du genre, vous ne voudriez pas que quelqu'un d'autre qu'un administrateur puisse effacer le cache.
je nettoie le cache de cette façon:
$fs = new Filesystem();
$fs->remove($this->getParameter('kernel.cache_dir'));