Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.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 Symfony2:在部署时刷新多个实例上的XCache类缓存_Php_Symfony_Caching_Doctrine Orm_Xcache - Fatal编程技术网

Php Symfony2:在部署时刷新多个实例上的XCache类缓存

Php Symfony2:在部署时刷新多个实例上的XCache类缓存,php,symfony,caching,doctrine-orm,xcache,Php,Symfony,Caching,Doctrine Orm,Xcache,app/console cache:clear并没有清除XCache(或APC),当我们在app.php中使用AppCache时(例如bootstrap.php.cache和所有其他生成的.cache.文件被缓存),重新部署后可能会导致重大问题 php(默认值) 我们的安装分布在4个“应用程序”服务器之间,因此在重新部署时无法可靠地清除缓存。我们需要的是告诉环境中的所有服务器刷新其PHP/XCache的方法。APC包似乎是这样的,但只适用于APC 一个相关的问题是使用原则:缓存:清除查询或清除元

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

php(默认值)

我们的安装分布在4个“应用程序”服务器之间,因此在重新部署时无法可靠地清除缓存。我们需要的是告诉环境中的所有服务器刷新其PHP/XCache的方法。APC包似乎是这样的,但只适用于APC

一个相关的问题是使用
原则:缓存:清除查询
清除元数据
命令。当我们使用XCache作为ORM元数据的缓存实现时,这些命令实际上根本不会刷新任何内容,即使它们正在编写“清除所有元数据缓存项” 已成功删除缓存项。“->查看XCache admin会发现所有内容仍然存在。这实际上是意料之中的,因为Symfony命令在PHP CLI环境中运行。同样,APC包将正确地刷新缓存

a) 命令说所有东西都被刷新了,这是一个“bug”还是我们遗漏了什么? b) 我们如何可靠地刷新所有服务器上的缓存? c) 是否有人编写了类似于APCBundle的解决方案,并且能够提出如何处理这些问题的最佳实践?
d) 在重新部署后重新启动每个Apache是否更可行(没有办法,但是很难,我们的系统操作会让我死)

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

有几种部署策略,但在所有这些策略中,重启Apache都可以实现这一目的。尽管有很多方法可以选择:)您可以将具有旧代码的实例与具有新代码的实例(drop和warmup缓存)交换。或者(如果您使用的是负载平衡器),您可以将新实例添加到组中并删除旧实例

根据我的经验,重新启动
php fpm
(我已经好几年没有使用Apache了)将很快清除APC,它工作非常稳定,而且根本没有停机时间


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

是的,我们实际上已经选择使用Memcache作为结果缓存层(它已经存在并且工作正常)。但是要缓存实体元数据和DQL>SQL转换,xcache就完全足够了。主要的问题是我们的“类”缓存:除非我们刷新它,否则它将保留旧的定义。我认为您不能(应该)在Redis中缓存操作码,是吗:)?然后我会重新启动php fpm(在您的情况下是Apache)。当然,没有用于操作码的redis:)告诉我们仍然认为您不应该重新启动Web服务器的管理员:(
$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);