Как очистить кеш Doctrine APC для продакшена?

У меня возникает эта проблема, когда я добавляю столбец к одному из своих объектов и выпускаю его для производства, мне нужно перезапустить Apache, чтобы очистить кеш APC / APCU метаданных Doctrine.

Я пробовал все приведенные ниже команды, но ни одна из них у меня не сработала:

php -r "apc_clear_cache();"
php -r "apcu_clear_cache();"

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

Я получаю это сообщение об ошибке для --env = prod

sudo php app/console doctrine:cache:clear-metadata  --env=prod
sudo php app/console doctrine:cache:clear-query  --env=prod
sudo php app/console doctrine:cache:clear-result --env=prod

 [LogicException]
  Cannot clear APC Cache from Console, its share in the Web server memory and not accessible from the CLI.

Единственный способ обновить кеш Doctrine - это перезапустить сервер Apache, что иногда может быть проблемой.

Мои настройки кеша для Doctine в моем проекте Symfony:

doctrine:
    orm:
        metadata_cache_driver: apc
        result_cache_driver: apc
        query_cache_driver: apc
        second_level_cache:
            enabled: true
            log_enabled: false
            region_cache_driver: apc

Как я могу очистить кеш APC в этом случае, не перезагружая Apache каждый раз, когда я выпускаю новое обновление схемы в производство. Это еще хуже, если у вас есть много серверов за балансировщиком нагрузки.


person pmoubed    schedule 11.10.2016    source источник


Ответы (4)


Вы должны понимать, что Php, работающий под Apache (или Nginx), отличается от Php, работающего через командную строку, это 2 процесса Linux, которые не могут обмениваться данными.

Таким образом, даже если вы можете очистить кеш через CLI, это не повлияет на php под Apache.

Самый простой способ - вызвать apcu_clear_cache внутри контроллера Symfony, или вы можете использовать сокет Apache Php через CLI.

Я рекомендую использовать такой инструмент, как http://gordalina.github.io/cachetool/, который это прекрасно.

person Thomas Decaux    schedule 08.11.2017

Вместо того, чтобы пытаться очистить его с консоли, попробуйте сделать это с помощью контроллера или app.php.

Я прокомментировал эту строку в app.php:

//apcu_clear_cache ();

Когда мне нужно очистить кеш, я просто раскомментирую его и загружаю любую страницу. Меня устраивает.

person devilcius    schedule 11.10.2016
comment
Очистка кеша apcu при каждой загрузке страницы подавляет его преимущества - person Quentin S.; 10.06.2019

Когда вы запускаете apc_clear_cache (); не из cli, а из вашего приложения, кеш доктрины будет очищен. Вы можете сделать какую-нибудь кнопку в админке или отправить curl-запрос на свой сервер после каждого обновления указанного файла, например:

http://example.com/apc_cache_clear.php

внутри запроса авторизации и очистки кеша

person Artur R.    schedule 01.03.2017
comment
как насчет того, чтобы у вас было сотни серверов? - person pmoubed; 07.03.2017
comment
Думаю, вам следует использовать серверы Redis и кеш Redis вместо APC :) - person Artur R.; 24.05.2019

Взгляните на Smart-Core / AcceleratorCacheBundle. Предоставьте команду для очистки кеша PHP Accelerator из интерфейса командной строки.

Это может разрешить очистку кеша с помощью команды cli, например:

php app/console cache:accelerator:clear

Документ также включает рецепт Capifony.

Надеюсь на эту помощь

person Matteo    schedule 11.10.2016
comment
Предпочтительно я не хочу использовать другой пакет только для этого. - person pmoubed; 19.10.2016