2014-06-22 5 views
11

Ich verwende einen Memcached-Server (zusammen mit der PHP-Erweiterung von memcache), um Validator-Metadaten und Doctrine-Metadaten-/Ergebnis-/Abfrage-Cache-Treiber zwischenzuspeichern.Symfony app/console cache: löschen - env ​​= prod und cache (APC, Memcached, etc)?

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

Meine Frage ist, führt der Befehl:

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

automatisch klar alle Arten von Cache (einschließlich memcache)?

Nachdem dieser Befehl ausgeführt wird und die Serverstatistiken Überprüfung Produkte zählen ist immer das gleiche sowie Cache Beruf:

enter image description here

Meine Konfiguration, wobei% prod_cache% Parameter ist tatsächlich der String 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] 

Antwort

5

Sie haben sich externe Cache zu löschen, aus dem doc (SF 2.5):

Es kann viele andere Dinge, die Sie tun müssen, je nach Ihr Setup: [...] Ihr APC-Cache löschen

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

+0

Symfony/Lehre hat tatsächlich Befehle für diese finden Sie unter [meine Antwort hier] (http://stackoverflow.com/a/24652434/1237411) –

1

Wenn Sie Anbieter überprüfen/Symfony/src/Symfony/Bundle/FrameworkBundle/Befehl/CacheClearCommand.php Sie werden sehen, 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); 
} 
2

Mit diesem Befehl nicht die Memcache gelöscht, da es sich um eine eigenständige verteiltem Speicher Cacher ist. Es löscht nur den Symfony-Cache. So löschen Sie die memcache Sie manuell ausführen müssen:

echo 'flush_all' | nc localhost 11211 

Aber ich denke, Sie wissen schon.

13

cache: clear

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

Lehre Befehle

Um die Lehre Caches, die Verwendung zu löschen:

  • 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 sich die doctrine:cache:clear-* Befehle ansehen, um sich zu inspirieren, wie Sie Ihren eigenen Befehl erstellen können.

Wenn Sie Ihre Konfiguration betrachten, verwenden Sie einen einzelnen Cache-Speicher für die drei Doctrine-Caches und den Symfony Validator-Cache. Also sollte nur einer der doctrine:cache:clear-* alles löschen.

Off topic

Wenn ein Cache-System wie APC verwenden, OPcache, und vielleicht andere, werden Sie müssen verstehen, dass, wenn Sie einen PHP-Skript von der Kommandozeile ausgeführt werden, ein anderer Speicherplatz verwendet wird, dann, wenn ein PHP-Skript von einem Webserver ausgeführt wird.

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.

+0

Vergessen Sie nicht, --env = prod am Ende der Doktrin-Befehle hinzuzufügen! – 10us

-1

versuchen Sie dies:

php app/console memcached:clear --clearAll default 
1

Wenn Sie einen Cache wie APC verwenden möchten, die verwendet verschiedene Speicherplatz für Konsole und Webserver, Sie haben keine andere warum dann zu haben 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 Doktrincaches ausführt.

Unabhängig von der Methode, mit der Sie den Cache löschen, werden einige Cache-Typen wie memcache 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 etwas wie folgt aus:

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