Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用Capifony部署Symfony2应用程序-APC loader仍然使用以前的版本_Php_Symfony_Apc_Capifony - Fatal编程技术网

Php 使用Capifony部署Symfony2应用程序-APC loader仍然使用以前的版本

Php 使用Capifony部署Symfony2应用程序-APC loader仍然使用以前的版本,php,symfony,apc,capifony,Php,Symfony,Apc,Capifony,我最近将我的Symfony2应用程序升级到2.1,并将其迁移到一个新的服务器上,因此我想我应该进行配置,使部署更简单。一切都很顺利,除了它现在没有使用APCLoader这个事实,所以我不得不暂时对它进行评论,直到它被分类 以下是app.php中的相关代码: $loader = require_once __DIR__.'/../app/bootstrap.php.cache'; // Use APC for autoloading to improve performance. // Chan

我最近将我的Symfony2应用程序升级到2.1,并将其迁移到一个新的服务器上,因此我想我应该进行配置,使部署更简单。一切都很顺利,除了它现在没有使用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缓存的全部内容吗


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

您可以尝试清除APC缓存

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

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

<?php
apc_clear_cache();

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

另一个可能更简单的解决方案是,只需在发布过程中构建一个类映射文件,而不是将apc用于类映射。我还无法找到原因(无论如何,现在还没有),但我发现即使在部署新版本后清除apc用户缓存,旧版本仍然会污染缓存。(我不知道如何清除,因为我使用了“分解器”建议的方法来清除,并且我在将符号链接更新到新版本后这样做,因此旧文件不应再被访问,但仍然会发生。编辑:找出发生这种情况的原因。请参阅)

不管怎样,我最终只是切换到使用composer转储自动加载程序文件,如此处“使用composer的类映射功能”部分所述:

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

php composer.phar dump-autoload --optimize
我不确定使用类映射文件与使用APC直接缓存类位置的效率,但它似乎对性能没有明显的影响。这两种方法显然都比每次查找时手动扫描文件系统有很大的帮助

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


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

谢谢,但是您知道如何从capifony部署脚本调用它吗?我想我可以创建一个Symfony2命令,比如包含函数调用的
my\u namespace:apc:clear
,并在部署后钩子中使用
run/path/to/app/console my\u namespace:apc:clear“
,从capifony执行这个命令,但我不确定这是否会使用CLI php而不是apache。你知道这有什么不同吗?是的,我认为CLI PHP有一个单独的缓存。-谢谢你的提醒。这个问题看起来很有用,我相信我现在能把它整理好。我会接受你的答案,但也会发布一个答案,说明我做了什么使它工作…谢谢,但我认为“解开者”有更有用的答案。你没有错。抱歉-我不认为我接受你的时它就在那里。如果你这样做了,一定要清除(或禁用)php的realpath缓存,如我下面的回答所述。否则APC类映射将简单地用错误的值重新填充。