简体   繁体   中英

Symfony2: How do I clear all of Symfony's (and all 3rd party plugins) cache in 1 command?

so I've been testing Doctrine queries and other Symfony code and I have to run several commands just to clear Doctrine/Symfony caches. I was searching for the net and came across another command to clear Assetic assets/etc.

From what I've read

php app/console cache:clear

will only clear Symfony cache. it won't include Doctrine and perhaps more.

I know I can create a bash script to clear all my caches but this obviously means I know all the "clear cache" commands. I only found out about the Assetic clear cache/assets by accident. What about those I don't know?

So is there 1 "clear cache" command that can do it for me? This will have to include Symfony/Doctrine/Assetic/Twig and whatever plugins I have installed.

Thanks a lot

What you are looking for is highly dependent on the developer of the bundle that uses the cache. Not even doctrine, that comes with the standard version of symfony has its cache clear command integrated. But what you can do is extend the default symfony command with a listener that runs all the cache clear command you want like this:

<?php
namespace DefaultBundle\Event\Listener;

use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\HttpKernel\CacheClearer\CacheClearerInterface;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\ConsoleOutput;
use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\Process\Process;

class CacheClearListener implements CacheClearerInterface
{
    private $environment;

    /**
     * @return array
     */
    private static function getCommands()
    {
        return array(
            'php ./app/console doctrine:cache:clear-metadata --no-debug --flush',
            'php ./app/console doctrine:cache:clear-query --no-debug --flush',
            'php ./app/console doctrine:cache:clear-result --no-debug --flush'
        );
    }

    public function clear($cacheDir)
    {
        $output = new ConsoleOutput();
        $output->writeln('');
        $output->writeln('<info>Clearing Doctrine cache</info>');

        foreach (self::getCommands() as $command) {
            $command .= ' --env='.$this->environment;
            $success = $this->executeCommand($command, $output);

            if (!$success) {
                $output->writeln(sprintf('<info>An error occurs when running: %s!</info>', $command));
                exit(1);
            }
        }
    }

    /**
     * @param string        $command
     * @param ConsoleOutput $output
     *
     * @return bool
     */
    private function executeCommand($command, ConsoleOutput $output)
    {
        $p = new Process($command);
        $p->setTimeout(null);
        $p->run(
            function ($type, $data) use ($output) {
                $output->write($data, false, OutputInterface::OUTPUT_RAW);
            }
        );
        if (!$p->isSuccessful()) {
            return false;
        }
        $output->writeln('');

        return true;
    }

    /**
     * @param Kernel $kernel
     */
    public function setKernel(Kernel $kernel)
    {
        $this->environment = $kernel->getEnvironment();
    }
}

Register the listener like this:

<service id="cache_clear_listener" class="DefaultBundle\Event\Listener\CacheClearListener">
    <call method="setKernel">
        <argument type="service" id="kernel"/>
    </call>
    <tag name="kernel.cache_clearer"  priority="254" />
</service>

And that is all. Now all you need to do is keep adding your new cache clear command to the getCommands() method. In order to find this commands you can run something like

php app/console | grep cache

to see all available commands that contain the word "cache" in them

After your listener is set, every time you run php app/console cache:clear it will trigger all the command that you listed in the getCommands() method of your listener.

Hope this helps, Alexandru

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM