Очистить filesystemcache в symfony 3.4

Я использую Symfony \ Component \ Cache \ Simple \ FilesystemCache;

Он работает, когда я $ cache-> set $ cache-> get $ cache-> clear () и т. д. Я не хочу использовать собственный ttl. Я хочу очистить кеш, установленный только с помощью console.

Но когда я делаю php bin / console cache: clear, он не очищает кеш, который я установил ранее с помощью FilesystemCache.

Я попытался очистить все пулы с помощью консоли, но это тоже не очистило $ cache.

Какую ошибку вы обнаружили с помощью команды запуска? Пожалуйста, добавьте это в вопросе

Manmohan 10.09.2018 12:09

Спасибо, наконец-то разобрался сам (ответ ниже)

Guillaume Harari 10.09.2018 12:49
0
2
1 113
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Наконец-то он работает, используя AdapterInterface

<?php
namespace Gh\GhBundle\Manager;

use Symfony\Component\Cache\Adapter\AdapterInterface;

class AppManager
{


    protected $_rootDir;
    protected $_cache;

    public function __construct($rootDir, AdapterInterface $cache)
    {
       $this->_rootDir = $rootDir;
       $this->_cache = $cache;
    }

    /**
     * 
     * Get version of this app
     * @return string
     */
    public function getVersion()
    {
        $cache = $this->_cache;
        $numVersion = $cache->getItem('stats.num_version');
        if (!$numVersion->isHit()) {
            $version = !file_exists($this->_rootDir . '/RELEASE.TXT') ? 'dev' : file_get_contents($this->_rootDir . '/RELEASE.TXT');
            $numVersion->set($version);
            $cache->save($numVersion);
        }
        return $numVersion->get();
    }

    /**
     * 
     * Get name of this app
     * @return string
     */
    public function getName()
    {
        return 'GH';
    }


}

1. Почему это происходит

Команда Symfony bin/console cache:clear очищает кеш только из каталога кэша ядра, которым по умолчанию является var/cache/{env}.

Когда вы создаете экземпляр FilesystemCache, вы можете указать путь, по которому вы хотите сохранить свой кеш, в качестве третьего параметра. Вот подпись конструктора FilesystemCache

public function __construct(string $namespace = '', int $defaultLifetime = 0, string $directory = null)

Если вы не укажете третий параметр, он будет иметь формат sys_get_temp_dir().'/symfony-cache', то есть /tmp/symfony-cache в Linux. Как видите, это другой каталог, и он не будет очищен командой cache:clear.

2. Как это исправить

Правильный путь

Вам нужно создать свою собственную команду data-cache:clear. Все очень просто https://symfony.com/doc/current/console.html

В методе execute() вашей команды вы должны создать экземпляр FilesystemCache и вызвать на нем clear(). Пример:

protected function execute(InputInterface $input, OutputInterface $output)
{
    $cache = new FilesystemCache();
    $cache->clear();
}

Затем вы можете вызвать php bin/console data-cache:clear с консоли. Если вы решите в будущем переключиться на какой-либо другой механизм кэширования (Redis, Memcached и т. д.), Вы можете просто настроить эту команду, чтобы очистить этот кеш.

Неправильный путь

It will only work if you keep using FilesystemCache and does not provide fine-grained control of which cache you actually clear.

Вы можете сохранить свой кеш в kernel.cache_dir, передав третий параметр в FilesystemCache при его создании. Пример:

$cache = new FilesystemCache('', 0, $container->getParameter('kernel.cache_dir').'/data-cache');

или когда настроен как услуга

Symfony\Component\Cache\Simple\FilesystemCache:
  arguments:
    - ''
    - 0
    - '%kernel.cache_dir%/data-cache'

Таким образом, команда Symfony cache:clear будет работать для вас, но хранить эти 2 типа кеша в одном месте - не лучшая идея.

If you change some of your project files, you may want to clear only kernel cache in /var/cache while keeping your data cache intact and vice versa. That's why I recommend not to use this solution!

Другие вопросы по теме