4

我最近将我的 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 缓存的全部内容?

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

4

3 回答 3

9

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

于 2012-10-12T12:56:15.883 回答
1

您可以尝试清除 APC 缓存。

最简单的方法是重新启动 Apache。

您还可以编写一个 PHP 脚本来执行此操作:

<?php
apc_clear_cache();

看:

优雅的 Apache 重启会清除 APC 吗?

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

于 2012-10-12T11:39:56.507 回答
1

另一个可能更简单的解决方案是在发布过程中简单地构建一个类映射文件,而不是使用 APC 作为类映射。我一直无法追查原因(无论如何),但我发现即使在部署新版本后清除 apc 用户缓存,旧版本仍然会污染缓存。(我不确定如何,因为我使用了theunraveler建议的方法来清除,并且我在将符号链接更新到新版本之后这样做,因此不应再访问旧文件,但它仍然会发生。编辑:弄清楚为什么会发生这种情况。见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 的 realpath 缓存(或禁用它),如此处所述。否则 php 将在缓存被清除后继续访问旧版本中的文件,这将导致使用错误的路径重新填充它。

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

于 2014-03-27T06:29:05.563 回答