0

app/console cache:clear 不会清除 XCache(或 APC),当我们在其中使用 AppCache 时app.php(例如 bootstrap.php.cache 和所有其他生成.cache.的文件都被缓存),这可能会在重新部署后导致重大问题。

app.php(非常默认)

$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);

我们的安装分布在 4 个“应用程序”服务器之间,因此无法在重新部署时可靠地清除缓存。我们需要一种方法来告诉我们环境中的所有服务器刷新它们的 PHP/XCache。APCBundle https://github.com/ornicar/ApcBundle似乎是这样,但仅适用于 APC。

一个相关的问题是使用doctrine:cache:clear-queryorclear-metadata命令。当我们使用 XCache 作为 ORM 元数据的缓存实现时,这些命令实际上根本不会刷新任何内容,即使它们正在编写“清除所有元数据缓存条目已成功删除缓存条目”。-> 查看 XCache 管理员会发现一切都还在那里。这实际上是意料之中的,因为 Symfony 命令在 PHP CLI 环境中运行。同样,APC Bundle 会正确刷新缓存。

a)命令说所有内容都已刷新或者我们遗漏了什么是“错误”吗?b) 我们如何可靠地刷新所有服务器上的这些缓存?c) 有没有人写过类似 APCBundle 的解决方案,并且可以提出如何处理这些问题的最佳实践?d)重新部署后重新启动每个 Apache 是否更可行(没有办法,但很难,我们的管理员会因为这个想法而杀了我)

4

1 回答 1

2

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

有几种部署策略,但在所有这些策略中,重新启动 Apache 都可以解决问题。尽管关于如何操作有很多选择:) 您可以将具有旧代码的实例与具有新代码的实例交换(丢弃和预热缓存)。或者(如果您使用负载均衡器),您可以将新实例添加到组中并删除旧实例。

根据我的经验,重启php-fpm(我已经好几年不使用 Apache)会立即清除 APC,并且它工作非常稳定,而且根本没有停机时间。

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

于 2013-11-27T15:53:13.107 回答