web-dev-qa-db-fra.com

Quel est le meilleur moyen de nettoyer le cache sans exécuter la commande de console?

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?.

13
Johni

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. 

16
Samy Dindane

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);
   }
10
Pacufist

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);
}
3
HelpNeeder

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.

1
PLoginoff

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.

1
Tofandel

je nettoie le cache de cette façon:

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

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

0
Stan Fad