Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to clear Doctrine APC cache for production?

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.

like image 831
pmoubed Avatar asked Oct 11 '16 15:10

pmoubed


3 Answers

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.

like image 90
Thomas Decaux Avatar answered Oct 18 '22 02:10

Thomas Decaux


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.

like image 36
devilcius Avatar answered Oct 18 '22 04:10

devilcius


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

like image 1
Artur R. Avatar answered Oct 18 '22 03:10

Artur R.