应用程序/控制台缓存:清除不清除XCache(或APC),当我们在app.php
中使用AppCache时,重新部署后可能导致重大问题(例如bootstrap.php.cache和所有其他生成的{ {1}}文件被缓存)。
app.php(非常默认)
.cache.
我们的安装分布在4个“应用程序”服务器中,因此无法在重新部署时可靠地清除缓存。我们需要的是告诉我们环境中的所有服务器刷新他们的PHP / XCache。 APCBundle https://github.com/ornicar/ApcBundle似乎就是这样,但只适用于APC。
相关问题是使用$loader = require_once __DIR__.'/../app/bootstrap.php.cache';
$loader = new \Symfony\Component\ClassLoader\XcacheClassLoader('sf2dc4', $loader);
$loader->register(true);
require_once __DIR__.'/../app/AppKernel.php';
require_once __DIR__.'/../app/AppCache.php';
$kernel = new AppKernel('prod', false);
$kernel->loadClassCache();
$kernel = new AppCache($kernel);
Request::enableHttpMethodParameterOverride();
$request = Request::createFromGlobals();
$response = $kernel->handle($request);
$response->send();
$kernel->terminate($request, $response);
或doctrine:cache:clear-query
命令。当我们使用XCache作为ORM元数据的缓存实现时,这些命令实际上根本不会刷新任何内容,即使他们正在编写“清除所有元数据缓存条目”
成功删除了缓存条目。“ - >深入了解XCache管理员,发现一切仍然存在。实际上预计这是因为Symfony命令在PHP CLI环境中运行。再次,APC Bundle会正确刷新缓存。
a)命令说一切都已被冲洗或者我们错过了什么,这是一个“错误”吗? b)我们如何可靠地在所有服务器上刷新这些缓存? c)有没有人写过像APCBundle这样的类似解决方案,并且可以提出如何处理这些问题的最佳实践? d)重新部署后重新启动每个Apache是否更可行(除了艰难的方式,我们的sysops会因为这个想法而杀了我)
答案 0 :(得分:2)
如果您有多个实例,则应使用集中式缓存存储(例如,Redis通过SncRedisBundle来保留会话,doctrine元和查询缓存)。通过这种方式,您必须清除一次作为部署过程中最后一步的doctrine元数据或查询缓存。
有几种部署策略,但是在所有这些策略中重启Apache都可以解决问题。虽然有很多替代方法可以做到这一点:)你可以将具有旧代码的实例与具有新代码的实例交换(drop和warmup caches)。或者(如果您使用的是负载均衡器),您可以将新实例添加到组中并删除旧实例。
根据我的经验,重新启动php-fpm
(我现在几年没有使用Apache)会立即清除APC并且它非常稳定,也没有停机时间。
如果还有问题,请随时问我。