我正在尝试在更新实体后清除学说缓存,以便在添加新属性后不会出现这样的错误:
Uncaught Error: Typed property Project\Entities\Entity::$property must not be accessed before initialization in ...
php cli-config.php orm:clear-cache:metadata
和 php cli-config.php orm:clear-cache:result
工作正常,但是当我尝试执行 php cli-config.php orm:clear-cache:query
时,出现错误:
In QueryCommand.php line 43:
Cannot clear APCu Cache from Console, it's shared in the Webserver memory and not accessible from the CLI.
如果我在 php.ini 中为 CLI 禁用 APCu,如下所示:
apc.enable_cli=0
然后
orm:clear-cache:query
结果是:
In MemcachedAdapter.php line 300:
MemcachedAdapter client error: connection failure
如果 APCu 不可用,Doctrine 默认使用 MemcachedAdapter。
当创建
EntityManager
并将 isDevMode
设置为 true 时,它工作正常(不会发生错误),但我不相信这是一个有效的解决方案。
new EntityManager(
DriverManager::getConnection($params),
ORMSetup::createAttributeMetadataConfiguration(
paths: [__DIR__ . '/../Entities'],
isDevMode: true, // should be false as it's production
proxyDir: __DIR__ . '/../../../tmp',
),
);
版本:
我没有使用 Symfony,只是使用普通的 Doctrine。
如何解决此问题以便我可以正确清除生产缓存?
确实,Doctrine 的官方文档指出:
这些任务均不适用于 APC、APCu 或 XCache 驱动程序 因为存储缓存的内存只能被访问 网络服务器。
然后您可以直接在网络服务器上操作在网页中使用 PHP 命令(不通过 CLI)。
这是我个人使用的代码:
$doctrine = orm_instance();
echo "getResultCache() CLEAR <br>";
$cacheDriver = $doctrine->em->getConfiguration()->getResultCache();
$cacheDriver->clear();
echo "getQueryCache() CLEAR <br>";
$cacheDriver = $doctrine->em->getConfiguration()->getQueryCache();
$cacheDriver->clear();
echo "getMetadataCache() CLEAR <br>";
$cacheDriver = $doctrine->em->getConfiguration()->getMetadataCache();
$cacheDriver->clear();
dump($doctrine->em);
另一种简单的方法是也在 PHP 网页中执行 APCu 本机方法。
$result = apcu_clear_cache();
dump(apcu_cache_info());