Symfony:清除学说缓存

问题描述 投票:0回答:8

我需要清除 Symfony 中的 doctrine 缓存。

命令行中必须有某种方法来清除缓存

或者我应该在哪里找到并删除属于缓存的文件?

php caching symfony doctrine
8个回答
141
投票

对于 Symfony 3+:

 php bin/console

将列出所有命令,以下与缓存相关:

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

Symfony 3 之前:

app/console

将列出您如何做到这一点

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

11
投票

如果您想在代码中执行此操作(来自 Doctrine 的文档):

如果您只是想删除所有缓存条目,您可以使用 deleteAll() 方法。

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

2
投票

我以为我对学说结果缓存感到疯狂 - 最后我不得不重新启动 memcached。


2
投票

如果你使用APC,你也可以直接调用代码

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

在同一服务器上的 php 页面中。这就是 Antho 答案中的 deleteAll() 方法的作用,但您不依赖于 Doctrine Classes。顺便说一句:整个缓存将被刷新 - 以防万一您将其用于非 Doctrine 内容。


1
投票

我知道这篇文章的标题是 Symfony 2,但是对于那些来自 google 的人来说,如果你有 Symfony 3+,那么它会是:

bin/console

相对于:

app/console

0
投票

也许有点晚了,但就我而言,学说没有在生产中生成代理类,因此我将

auto_generate_proxy_classes
更改为 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%"

0
投票

也许有人在寻找
交响乐 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
}

0
投票

希望这可以帮助那些遇到 Doctrine 缓存问题的人。

我遇到了 OrderBy 属性的问题,并且 PostLoad 事件似乎没有触发。问题是该实体已经加载到 EntityManager 中(从我创建它时开始)。因为它已经加载,所以后续的获取它的调用将进入内存/缓存,并且预期的事件不会被触发。

要修复此问题,您可以从 EntityManager 中清除该实体。然后,当您获取实体时,PostLoad 回调、OrderBy 等将触发。您可以像这样从 EntityManager 中清除实体:

$this->em->clear(MyEntity::class);
© www.soinside.com 2019 - 2024. All rights reserved.