如何清除生产环境下的Doctrine APC缓存?

8

当我向实体添加列并发布到生产环境中时,我遇到了这个问题:我必须重新启动Apache才能清除Doctrine元数据APC/APCU缓存。

我尝试了下面所有的命令,但都没有成功:

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服务器,这有时可能会产生问题。

在我的Symfony项目中,Doctine的缓存设置如下:

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

如何在不重启Apache的情况下清除APC缓存,每次发布新的模式更新到生产环境中。如果您有许多服务器在负载均衡器后面,这种情况会更糟。

4个回答

8
您必须明白,运行在Apache(或Nginx)下的Php与通过命令行运行的Php是不同的,它们是两个Linux进程,无法通信。
因此,即使您可以通过CLI清除缓存,这也不会影响Apache下的php。
最简单的方法是在Symfony控制器中调用apcu_clear_cache,或者您可以通过CLI使用Apache Php套接字。
我建议使用像http://gordalina.github.io/cachetool/这样的工具,它可以完美地完成这项工作。

2

不要试图从控制台清除它,尝试从控制器或app.php中处理。

我将这行代码在app.php中注释了:

//apcu_clear_cache ();

当我需要清除缓存时,我只需将其取消注释并加载任何页面。这对我有效。


在每个页面加载时清除apcu缓存会抑制其优点。 - Quentin S.

1
当您在应用程序中运行apc_clear_cache();而不是从cli运行时,Doctrine缓存将被清除。您可以在管理面板中创建一些按钮,或在每次更新指定文件后向服务器发送curl请求,例如:

http://example.com/apc_cache_clear.php

授权请求和清除缓存内部


如果你有数百台服务器怎么办? - pmoubed
那么,你应该使用 Redis 服务器和 Redis 缓存,而不是 APC :) - Artur R.

0

看一下Smart-Core/AcceleratorCacheBundle,提供一个命令从CLI清除PHP加速器缓存。

这可以允许通过cli命令刷新缓存:

php app/console cache:accelerator:clear

文档中还包括Capifony的配方。

希望这可以帮到您。


2
最好不要为此再使用另一个Bundle。 - pmoubed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接