Я пытаюсь очистить кеш доктрины после обновления сущностей, чтобы после добавления нового свойства не возникало подобных ошибок:
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.
Если я отключу APCu для CLI в php.ini следующим образом:
apc.enable_cli=0
тогда orm:clear-cache:query приведет к:
In MemcachedAdapter.php line 300:
MemcachedAdapter client error: connection failure
поскольку Doctrine по умолчанию использует MemcachedAdapter, если APCu недоступен.
При создании 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.
Как подойти к этой проблеме, чтобы правильно очистить производственный кеш?
@Markus Zeller на самом деле это так, забыл добавить, что при создании EntityManager с isDevMode: true (чтобы он использовал ArrayAdapter в качестве кеша) он работает нормально
Если это просто кеш веб-сервера, почему бы просто не перезапустить его? С помощью apache2 вы можете выполнить плавный перезапуск, чтобы ни один запрос не был уничтожен. service apache2 graceful. Это приведет к перезапуску только веб-службы, а не всей системы.
@MarkusZeller, поскольку я не являюсь владельцем сервера, у меня нет разрешений на управление службами, сервис apache2 изящный.: невозможно открыть /etc/rc.subr: разрешение отклонено






Действительно, официальная документация 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);
Другой простой способ — выполнить собственные методы APCu на веб-странице PHP.
$result = apcu_clear_cache();
dump(apcu_cache_info());
Вы это как-то скрываете или охраняете? Я хочу очистить кеш во время развертывания, и мне интересно, есть ли лучшее решение, чем создание, например. Конечная точка API с параметром пароля, чтобы никто не мог очистить кеш в любое время.
Защищено учетными данными/ролями пользователя. Если вы хотите сделать это быстро (и немного грязно), вы можете настроить безопасную папку через файл .htaccess, если вы запускаете свой код на Apache.
Первое сообщение об ошибке не связано с кешем. Вы просто получаете доступ к свойству до того, как оно было установлено.