Frage Symfony App / Konsolencache: clear --env = prod und cache (APC, Memcached, etc)?


Ich benutze einen Memcached-Server (zusammen mit der PHP-Erweiterung von memcache), um die Validator-Metadaten und Doctrine-Metadaten- / Ergebnis- / Abfrage-Cache-Treiber zwischenzuspeichern.

Alles funktioniert wie erwartet und ist schnell im Vergleich zum Dateisystemcache.

Meine Frage ist, tut der Befehl:

php app/console cache:clear --env=prod --no-debug

automatisch alle Arten von Cache (einschließlich Memcache) löschen?

Nach dem Ausführen dieses Befehls und Überprüfen der Server-Statistiken ist die Anzahl der Elemente immer dieselbe wie die der Cache-Belegung:

enter image description here

Meine Konfiguration, wobei% prod_cache% -Parameter tatsächlich die Zeichenfolge ist memcache:

# Framework Configuration
framework:
    validation:
        cache: %prod_cache% # Matches validator cache service

# Doctrine Configuration
doctrine:
    orm:
        metadata_cache_driver:
            type: service
            id: cache_%prod_cache%
        result_cache_driver:
            type: service
            id: cache_%prod_cache%
        query_cache_driver:
            type: service
            id: cache_%prod_cache%

# DoctrineCacheBundle Configuration
doctrine_cache:
    providers:
        memcache:
            type: memcache
            alias: cache_memcache

# Services
services:
    validator.mapping.cache.memcache: # Validator cache service
        class: Symfony\Component\Validator\Mapping\Cache\DoctrineCache
        arguments: [@cache_memcache]

11
2018-06-22 17:33


Ursprung


Antworten:


Cache: Löschen

Das cache:clear Der Befehl löscht die Doctrine-Caches nicht. Es löscht nur einige Symfony 2 Framework-spezifische Caches, hauptsächlich die app/cache (oder var/cache) Verzeichnisse.

Doktrin-Befehle

Um die Doctrine-Caches zu löschen, verwenden Sie:

  • doctrine:cache:clear-metadata --env=prod
  • doctrine:cache:clear-query --env=prod
  • doctrine:cache:clear-result --env=prod

Zusätzliche Caches

Wenn Sie zusätzliche Cache-Speicher verwenden, müssen Sie sie selbst löschen. Sie können auf die doctrine:cache:clear-* Befehle, mit denen Sie sich inspirieren lassen, wie Sie Ihren eigenen Befehl erstellen können.

Wenn Sie Ihre Konfiguration betrachten, verwenden Sie einen einzelnen Cache-Speicher für die 3 Doctrine-Caches und den Symfony Validator-Cache. Also ruft nur eines der doctrine:cache:clear-* sollte alles klären.

Off-Thema

Wenn Sie ein Cache-System wie APC, OPcache und vielleicht andere verwenden, müssen Sie verstehen, dass beim Ausführen eines PHP-Skripts über die Befehlszeile ein anderer Speicherplatz verwendet wird, wenn Sie ein PHP-Skript von einem Webserver ausführen.

Mit anderen Worten: Wenn Sie solche Caches über die Befehlszeile löschen, sind die vom Webserver verwendeten Caches nicht betroffen. Um die Webserver-Caches zu löschen, müssen Sie die Cache-Lösch-Skripts vom Webserver selbst ausführen.

Dies ist kein Problem für Memcached, da es ein separates Programm ist, das seinen eigenen Speicherplatz verwaltet.


13
2017-07-09 11:25



Sie müssen den externen Cache selbst löschen, aus dem Dokument (SF 2.5):

Es kann viele andere Dinge geben, die Sie tun müssen, abhängig von   Ihre Einrichtung:           [...] Löschen Sie Ihren APC-Cache

Sehen: http://symfony.com/doc/current/cookbook/deployment/tools.html#e-other-things


5
2017-07-07 00:54



Dieser Befehl löscht den Memcache nicht, da es sich um einen eigenständigen verteilten Speichercacher handelt. Es löscht nur den Symfony-Cache. Um den Memcache zu löschen, müssen Sie manuell starten:

echo 'flush_all' | nc localhost 11211

Aber ich denke, das weißt du schon.


3
2017-07-08 09:46



Die clear: cache-Befehle leeren nur den Symfony-Cache im Dateisystem und erwärmen ihn dann. Sie können einige zusätzliche Pakete verwenden, um andere Caches zu löschen:

Memcache: https://github.com/LeaseWeb/LswMemcacheBundle

APC: https://github.com/ornicar/ApcBundle


2
2017-07-11 16:31



Wenn Sie Anbieter / symfony / src / Symfony / Bundle / FrameworkBundle / Command / CacheClearCommand.php überprüfen, sehen Sie, dass Symfony den Cache mit dem Dateisystemdienst löscht. Es löscht den Cache durch Entfernen des alten Verzeichnisses.

Hier ist die genaue Funktion (Symfony 2.4)

    protected function execute(InputInterface $input, OutputInterface $output)
{
    $realCacheDir = $this->getContainer()->getParameter('kernel.cache_dir');
    $oldCacheDir  = $realCacheDir.'_old';
    $filesystem   = $this->getContainer()->get('filesystem');

    if (!is_writable($realCacheDir)) {
        throw new \RuntimeException(sprintf('Unable to write in the "%s" directory', $realCacheDir));
    }

    if ($filesystem->exists($oldCacheDir)) {
        $filesystem->remove($oldCacheDir);
    }

    $kernel = $this->getContainer()->get('kernel');
    $output->writeln(sprintf('Clearing the cache for the <info>%s</info> environment with debug <info>%s</info>', $kernel->getEnvironment(), var_export($kernel->isDebug(), true)));
    $this->getContainer()->get('cache_clearer')->clear($realCacheDir);

    if ($input->getOption('no-warmup')) {
        $filesystem->rename($realCacheDir, $oldCacheDir);
    } else {
        // the warmup cache dir name must have the same length than the real one
        // to avoid the many problems in serialized resources files
        $warmupDir = substr($realCacheDir, 0, -1).'_';

        if ($filesystem->exists($warmupDir)) {
            $filesystem->remove($warmupDir);
        }

        $this->warmup($warmupDir, $realCacheDir, !$input->getOption('no-optional-warmers'));

        $filesystem->rename($realCacheDir, $oldCacheDir);
        if (defined('PHP_WINDOWS_VERSION_BUILD')) {
            sleep(1);  // workaround for Windows PHP rename bug
        }
        $filesystem->rename($warmupDir, $realCacheDir);
    }

    $filesystem->remove($oldCacheDir);
}

1
2017-07-07 01:27



Wenn Sie einen Cache wie APC verwenden, der anderen Speicherplatz für Konsole und Web-Server verwendet, haben Sie keine andere Ursache und Schnittstelle, wo Sie den Cache manuell löschen.

Für Memcache, Memcached usw. können Sie sich in den Cache einklinken: Löschen Sie den Befehl, indem Sie einen Listener über das Ereignis kernel.cache_clearer erstellen, das beide Befehle zum Löschen des Doktrin-Cache ausführt.

Welche Methode Sie auch zum Löschen des Cache verwenden, einige Cachetypen wie Memcache, wird den verwendeten Speicher nicht freigeben. Stattdessen werden sie den Schlüssel aufheben, wenn das nächste Mal ein Befehl get auf diesem Schlüssel ausgegeben wird oder wenn der Speicher voll ist und einige Schlüssel entfernt werden müssen.

class CacheClearDoctrineListener implements CacheClearerInterface
{
/**
 * @var ContainerInterface
 */
protected $container;

protected $environment;

public function setContainer(ContainerInterface $container = null)
{
    $this->container = $container;
    $this->environment = $container->get('kernel')->getEnvironment();
}

public function clear($cacheDir)
{
    $this->clearCacheMetadata();
    $this->clearCacheQuery();
}

protected function clearCacheMetadata()
{
    // clear cache metadata
    $application = new Application($this->container->get('kernel'));
    $application->setAutoExit(false);

    $output = new ConsoleOutput();
    $arguments = array(
        "command" => "doctrine:cache:clear-metadata",
        "--env" => $this->environment
    );
    $input = new ArrayInput($arguments);
    $returnCode = $application->run($input, $output);

    if ($returnCode != 0) {
        $output->writeln(json_decode(rtrim($output)));
    }
}

protected function clearCacheQuery()
{
    // clear cache query
    $application = new Application($this->container->get('kernel'));
    $application->setAutoExit(false);

    $output = new ConsoleOutput();
    $arguments = array(
        "command" => "doctrine:cache:clear-query",
        "--env" => $this->environment
    );
    $input = new ArrayInput($arguments);
    $returnCode = $application->run($input, $output);

    if ($returnCode != 0) {
        $output->writeln(json_decode(rtrim($output)));
    }
}
}

Erklären Sie Ihren Service so:

<service id="cache_clear_doctrine_clearer" class="%namespace_of_your_listener%">
    <call method="setContainer">
        <argument type="service" id="service_container"/>
    </call>
    <tag name="kernel.cache_clearer"  priority="254" />
</service>

1
2017-11-24 09:54



Versuche dies:

php app/console memcached:clear --clearAll default

-1
2017-08-13 11:29