app/console缓存:clear并没有清除XCache(或APC),当我们在app.php
中使用AppCache时,这可能会在重新部署后导致重大问题(例如,bootstrap.hp.cache和所有其他生成的.cache.
文件都被缓存)。
app.php(相当默认)
$loader = require_once __DIR__.'/../app/bootstrap.php.cache';
$loader = new SymfonyComponentClassLoaderXcacheClassLoader('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);
我们的安装分布在4个"应用程序"服务器之间,因此无法在重新部署时可靠地清除缓存。我们需要的是告诉环境中的所有服务器刷新它们的PHP/XCache。APCBundlehttps://github.com/ornicar/ApcBundle似乎是这样,但只适用于APC。
一个相关的问题是使用doctrine:cache:clear-query
或clear-metadata
命令。当我们使用XCache作为ORM元数据的缓存实现时,这些命令实际上根本不会刷新任何内容,即使它们正在写"清除所有元数据缓存项"已成功删除缓存项。"->查看XCache管理会发现一切都还在。这实际上是意料之中的,因为Symfony命令在PHP CLI环境中运行。同样,APC捆绑包会正确地刷新缓存。
a) 命令说所有东西都被刷新了,这是一个"错误"吗?还是我们遗漏了什么?b) 我们如何可靠地刷新所有服务器上的缓存?c) 有没有人写过类似APCBundle的解决方案,并能提出如何处理这些问题的最佳实践?d) 在重新部署后重新启动每个Apache是否更可行(没有办法,但很难,我们的系统操作会因为这个想法而扼杀我)
如果您有多个实例,您应该使用集中式缓存存储(例如,Redis通过SncRedisBundle来保持会话、原则元和查询缓存)。这样,作为部署过程的最后一步,您将不得不清除条令元数据或查询缓存一次。
有几种部署策略,但在所有这些策略中,重新启动Apache就可以了。尽管有很多关于如何做到这一点的替代方案:)您可以将具有旧代码的实例与具有新代码的实例交换(丢弃和预热缓存)。或者(若您正在使用负载均衡器),您可以将新实例添加到组中并删除旧实例。
根据我的经验,重新启动php-fpm
(我已经好几年没有使用Apache了)将很快清除APC,而且它运行非常稳定,而且根本没有停机时间。
如果还有问题,请随时问我。