Невозможно очистить кэш APCu из консоли, он находится в памяти веб-сервера и недоступен из CLI

Я пытаюсь очистить кеш доктрины после обновления сущностей, чтобы после добавления нового свойства не возникало подобных ошибок:

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',
    ),
);

Версии:

  1. PHP: 8,2
  2. Доктрина ОРМ: 3.1
  3. Доктрина DBAL: 4.0

Я не использую Symfony, просто Doctrine.

Как подойти к этой проблеме, чтобы правильно очистить производственный кеш?

Первое сообщение об ошибке не связано с кешем. Вы просто получаете доступ к свойству до того, как оно было установлено.

Markus Zeller 18.03.2024 10:00

@Markus Zeller на самом деле это так, забыл добавить, что при создании EntityManager с isDevMode: true (чтобы он использовал ArrayAdapter в качестве кеша) он работает нормально

Unlucky 18.03.2024 10:04

Если это просто кеш веб-сервера, почему бы просто не перезапустить его? С помощью apache2 вы можете выполнить плавный перезапуск, чтобы ни один запрос не был уничтожен. service apache2 graceful. Это приведет к перезапуску только веб-службы, а не всей системы.

Markus Zeller 18.03.2024 10:11

@MarkusZeller, поскольку я не являюсь владельцем сервера, у меня нет разрешений на управление службами, сервис apache2 изящный.: невозможно открыть /etc/rc.subr: разрешение отклонено

Unlucky 18.03.2024 10:13
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
4
92
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Действительно, официальная документация 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 с параметром пароля, чтобы никто не мог очистить кеш в любое время.

Unlucky 18.03.2024 12:23

Защищено учетными данными/ролями пользователя. Если вы хотите сделать это быстро (и немного грязно), вы можете настроить безопасную папку через файл .htaccess, если вы запускаете свой код на Apache.

b126 18.03.2024 13:24

Другие вопросы по теме