使用Capifony部署Symfony2应用程序 - APC加载程序仍使用以前的版本

时间:2012-10-12 11:26:20

标签: php symfony apc capifony

我最近将我的Symfony2应用程序升级到2.1并将其迁移到新服务器,因此我认为我将配置Capifony以使部署更简单。一切都变得很好,除了它现在没有使用APCLoader这一事实,所以我不得不暂时对此进行评论,直到它被排序。

以下是app.php的相关代码:

$loader = require_once __DIR__.'/../app/bootstrap.php.cache';

// Use APC for autoloading to improve performance.
// Change 'sf2' to a unique prefix in order to prevent cache key conflicts
// with other applications also using APC.

$loader = new ApcClassLoader('my_prefix', $loader);
$loader->register(true);

问题是'my_prefix'每个版本不是唯一的,所以它最终会试图查找属于以前版本的缓存文件,这些文件可能存在也可能不存在。这显然是一个非常大的问题!

最佳解决方案是什么?我应该以某种方式编写一个capifony在部署之前运行的任务,将前缀更改为独特的内容,例如#{latest_release}变量?或者我应该在每次部署后以某种方式重置APC缓存的全部内容?

我不太确定做这些事情的最佳方法,所以如果你推荐其中一个,那么请指点我正确的方向来实现它吗?或者有没有我没有想到的替代解决方案?

3 个答案:

答案 0 :(得分:9)

您可以使用ApcBundle,它提供将在web/目录中创建新文件的命令,通过HTTP执行,然后将其删除。然后,您可以在部署脚本中使用run "/path/to/app/console apc:clear"命令。

答案 1 :(得分:1)

您可以尝试清除APC缓存。

最简单的方法是重启Apache。

您也可以编写PHP脚本来执行此操作:

<?php
apc_clear_cache();

请参阅:

Does a graceful Apache restart clear APC?

http://php.net/manual/en/function.apc-clear-cache.php

答案 2 :(得分:1)

另一个可能更简单的解决方案是在发布过程中简单地构建一个类图文件,而不是将APC用于类映射。我无法追查原因(但无论如何),但我发现即使我在部署新版本后清除apc用户缓存,旧版本仍然会污染缓存。 (我不确定如何,因为我使用了类似于unraveler建议的方法来清除,并且我在将符号链接更新到新版本之后这样做,所以不再访问旧文件,但它仍然会发生。编辑:弄清楚为什么会发生这种情况。请参阅https://stackoverflow.com/a/22680064/160565

无论如何,我最终只是转而使用composer转储自动加载器文件,如“使用Composer的类映射功能”部分所述:http://symfony.com/doc/current/book/performance.html

基本上你需要从app.php中删除ApcClassLoader内容,然后将这一行添加到你的部署中:

php composer.phar dump-autoload --optimize

我不确定使用类图文件和使用APC直接缓存类位置的效率是多少,但它似乎对性能没有明显的影响。对于每次查找手动扫描文件系统,这两者显然都是一个显着的推动力。

编辑:此外,如果您在部署新版本后采取清除APC缓存的方法,请确保您还清除php的实际路径缓存(或禁用它),as described here。否则,在清除缓存后,php将继续从旧版本访问文件,这将导致使用错误的路径重新填充它。

事实上,最好在发布时清除php的realpath缓存(或禁用它),否则项目中的任何非php文件都将与php文件不同步,直到缓存过期。