morteza kavakebi
morteza kavakebi

Reputation: 1680

Symfony: Clear doctrine cache

I need to clear my doctrine's cache in Symfony.

There must be some way in command line for clear the cache.

Or where should I find and delete the files belonging to cache?

Upvotes: 51

Views: 137874

Answers (8)

Collin Krawll
Collin Krawll

Reputation: 2520

In the hopes that this might help someone coming here with Doctrine caching issues.

I had an issue with the OrderBy attribute and the PostLoad event not seeming to fire. The problem was that the entity was already loaded into the EntityManager (from when I created it). Because it was already loaded, subsequent calls to get it went to memory/cache and the expected events wouldn't get fired.

To fix, you can clear the entity out of the EntityManager. Then when you get the entity, the PostLoad callback, OrderBy, etc will fire. You can clear the entity out of the EntityManager like so:

$this->em->clear(MyEntity::class);

Upvotes: 0

Murat Cakmak
Murat Cakmak

Reputation: 327

Maybe someone searching
Symfony 6.2+

public function __construct(..., private KernelInterface $kernel

And

$this->kernel->shutdown(); //RESET ALL

You running Multiple entities and You managed connection with Sessions

/** @var SiteService $siteService */
$siteService = $this->kernel->getContainer()->get(SiteService::class); //Important kernel->getContainer()
/** @var Site[] $sites */
$sites = $siteService->repository->getByInstalledSites();

foreach ($sites as $site) {
    dump('Domain:'. $site->getDomain());
    $session = new Session();
    $session->set('db_user', $site->getUser());
    $session->set('db_password', $this->getDecryptPassword($site->getPassword()));
    $session->set('db_name', $site->getDatabaseName())
    
    $user = $this->userService->getById(1);

    dump($user);
    //what you want to do ...

    $this->kernel->shutdown(); //Running All bundles shutdown and container set null        
    $this->kernel->boot(); // services_resetter->reset and preboot -> loading bundles&Containers and all bundles set container & run boot
}

Upvotes: -1

amitchhajer
amitchhajer

Reputation: 12830

For Symfony 3+:

 php bin/console

will list all commands, the following are relevant for cache:

 php bin/console doctrine:cache:clear-metadata 
 php bin/console doctrine:cache:clear-query  
 php bin/console doctrine:cache:clear-result

Before Symfony 3:

app/console

will list how you can do it

 app/console doctrine:cache:clear-metadata 
 app/console doctrine:cache:clear-query  
 app/console doctrine:cache:clear-result 

Upvotes: 145

Antho
Antho

Reputation: 333

If you want to do it within your code (from Doctrine's documentation) :

If you simply want to delete all cache entries you can do so with the deleteAll() method.

$cacheDriver = new \Doctrine\Common\Cache\ArrayCache();
$deleted = $cacheDriver->deleteAll();

Upvotes: 12

Koronos
Koronos

Reputation: 557

Maybe is a little late for this, but in my case, doctrine didn't generate the proxy classes in production, for that I change the auto_generate_proxy_classes to true:

#symfony2&3 app/config/config.yml
#symfony4 config/packages/doctrine.yaml (by default true since 4.2)

doctrine:
    orm:
        auto_generate_proxy_classes: true #"%kernel.debug%"

Upvotes: 0

lsimonetti
lsimonetti

Reputation: 1482

I know the title of this post says Symfony 2, but for those of you coming from google, if you have Symfony 3+ its gonna be:

bin/console

As opposed to:

app/console

Upvotes: 1

Oli
Oli

Reputation: 103

In case you use APC, you could also just call the code

<?php
$deleted = apc_clear_cache() && apc_clear_cache('user');

in a php page on the same server. This is what deleteAll() method in Antho's answer does, but you do not depend on the Doctrine Classes. Btw: the complete cache will be flushed - just in case you use it for non-Doctrine stuff.

Upvotes: 2

beterthanlife
beterthanlife

Reputation: 1658

I thought I was going crazy with doctrine results caching - in the end I had to restart memcached.

Upvotes: 2

Related Questions