Symfony2:部署时在多个实例上刷新XCache类缓存

时间:2013-11-27 11:48:15

标签: php symfony caching doctrine-orm xcache

应用程序/控制台缓存:清除不清除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会因为这个想法而杀了我)

1 个答案:

答案 0 :(得分:2)

如果您有多个实例,则应使用集中式缓存存储(例如,Redis通过SncRedisBundle来保留会话,doctrine元和查询缓存)。通过这种方式,您必须清除一次作为部署过程中最后一步的doctrine元数据或查询缓存。

有几种部署策略,但是在所有这些策略中重启Apache都可以解决问题。虽然有很多替代方法可以做到这一点:)你可以将具有旧代码的实例与具有新代码的实例交换(drop和warmup caches)。或者(如果您使用的是负载均衡器),您可以将新实例添加到组中并删除旧实例。

根据我的经验,重新启动php-fpm(我现在几年没有使用Apache)会立即清除APC并且它非常稳定,也没有停机时间。

如果还有问题,请随时问我。