部署Symfony2的应用与Capifony - APC装载机仍然使用以前的版本(Deployi

2019-09-24 01:37发布

我最近升级我的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缓存后,每个部署的全部内容?

我不是太肯定做任何这些东西的最佳方式,因此,如果您会推荐他们中的一个,你可以请点我在正确的方向,以便能够实现它? 或者是有,我没有想到的替代解决方案?

Answer 1:

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



Answer 2:

你可以尝试清除缓存APC。

要做到这一点,最简单的办法就是重新启动Apache。

你也可以写一个PHP脚本这样做:

<?php
apc_clear_cache();

看到:

做一个优雅的Apache重新明确APC?

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



Answer 3:

另外,可能更简单的解决方案,这将是简单地建立一个类映射文件作为发布过程的一部分,而不是使用APC的类图。 我一直无法追查原因(但,无论如何),但我发现,甚至当我部署一个新版本后清除APC用户缓存,老版本仍然可以污染缓存。 (我不知道怎么样,因为我用的方法一样,通过theunraveler建议清楚,我更新符号链接到新版本后这样做,所以旧的文件不应再被访问,但它仍然发生。编辑:想通了,为什么出现这种情况,请参阅。 https://stackoverflow.com/a/22680064/160565 )

不管怎么说,我最终只是开关部分使用作曲家倾倒自动加载磁带机文件,如“使用Composer的类映射功能” desribed这里: http://symfony.com/doc/current/book/performance.html

基本上你需要从app.php删除ApcClassLoader的东西,那么这行添加到您的部署:

php composer.phar dump-autoload --optimize

我不知道效率是使用类映射文件VS使用APC直接缓存类位置的,但它似乎并没有对性能有显着的影响。 无论是一个显然是在手动扫描文件系统为每一个查找提振显著。

编辑:另外,如果你需要部署一个新的版本出现后清零APC缓存的方法,确保你也清楚PHP的真实路径缓存(或禁用), 如下描述 。 否则,PHP将继续从旧版本访问文件后的缓存已被清除,这将导致它用错误的路径进行重新填充。

事实上,这是一个好主意,反正清除发布PHP的真实路径缓存(或禁用),因为在你的项目,否则任何非PHP文件将不同步的PHP文件,直到缓存过期。



文章来源: Deploying Symfony2 app with Capifony - APC loader still uses previous release