Доктрина Symfony2 очистить кеш

Мне нужно очистить кэш моей доктрины в Symfony 2.

Должен быть какой-то путь в командной строке для очистки кэша.

Или где мне найти и удалить файлы, принадлежащие кешу?

8 ответов

Решение
app/console

перечислю, как вы можете это сделать

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

для симфонии 3+:

 bin/console

и список команд (для копирования / вставки из каталога проекта):

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

Если вы хотите сделать это в своем коде (из документации Doctrine):

Если вы просто хотите удалить все записи в кэше, вы можете сделать это с помощью метода deleteAll().

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

Если вы используете APC, вы также можете просто позвонить по коду

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

на странице PHP на том же сервере. Это то, что делает метод deleteAll() в ответе Antho, но вы не зависите от Doctrine Classes. Кстати: весь кеш будет сброшен - на тот случай, если вы используете его для вещей, не относящихся к доктрине.

Я думал, что схожу с ума от кэширования результатов доктрины - в конце концов мне пришлось перезапустить memcached.

Я знаю, что в заголовке этой статьи написано Symfony 2, но для тех из вас, кто пришел из Google, если у вас есть Symfony 3+, это будет:

bin/console

В отличие от:

app/console

Возможно, кто-то ищет
Symfony 6.2+

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

И

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

Вы используете несколько объектов и управляете соединением с помощью сеансов.

      /** @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
}

Возможно, это немного поздно, но в моем случае doctrine не генерировало прокси-классы в производстве, для этого я меняю auto_generate_proxy_classes к истине:

#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%"

В надежде, что это может помочь кому-то, кто придет сюда с проблемами кеширования Doctrine.

У меня возникла проблема с атрибутом OrderBy и событием PostLoad, которое не сработало. Проблема заключалась в том, что объект уже был загружен в EntityManager (с момента его создания). Поскольку он уже был загружен, последующие вызовы его получения отправлялись в память/кэш, и ожидаемые события не запускались.

Чтобы исправить это, вы можете удалить объект из EntityManager. Затем, когда вы получите объект, сработает обратный вызов PostLoad, OrderBy и т. д. Вы можете удалить объект из EntityManager следующим образом:

      $this->em->clear(MyEntity::class);
Другие вопросы по тегам