How to clear Doctrine APC cache for production?

2019-06-23 11:02发布

I have this issue when I add a column to one of my entities and release it for production I have to restart Apache in order to clear Doctrine metadata APC/APCU cache.

I have tried all commands below but none worked for me:

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

I get this error message for --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.

The only way I can get it to refresh Doctrine cache is to restart my apache server which can sometimes be an issue.

My cache settings for Doctine in my Symfony project:

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

How can I clear APC cache in this case without restarting Apache each time I release new schema update to production. This is even worse if you have many servers behind a load balancer.

4条回答
迷人小祖宗
2楼-- · 2019-06-23 11:25

Instead of trying to clear it from the console, try doing it from a controller or app.php.

I have this line commented in the app.php:

//apcu_clear_cache ();

When I do need to clear the cache, I just uncommented it and load any page. It works for me.

查看更多
Lonely孤独者°
3楼-- · 2019-06-23 11:42

You must understand that Php running under Apache (or Nginx) is different than the Php running via the command line, they are 2 Linux process that cant communicate.

So, even if you can clear the cache via CLI, this will not affect the php under Apache.

The easiest way it to call apcu_clear_cache inside a Symfony controller, or, you can use the Apache Php socket via the CLI.

I recommend to use a tool like http://gordalina.github.io/cachetool/, which do that perfectly.

查看更多
不美不萌又怎样
4楼-- · 2019-06-23 11:47

When you run apc_clear_cache(); not from cli but from your app, doctrine cache will be cleared. You can make some button in admin panel, or send curl request to your server after each update to specified file, for example:

http://example.com/apc_cache_clear.php

inside autorize request and clear cache

查看更多
老娘就宠你
5楼-- · 2019-06-23 11:49

Take a look at the Smart-Core/AcceleratorCacheBundle Provide a command to clear PHP Accelerator cache from CLI.

This can permit to flush the cache as a cli command as:

php app/console cache:accelerator:clear

The doc include also a Capifony's recipe.

Hope this help

查看更多
登录 后发表回答