【发布时间】:2015-04-01 05:58:53
【问题描述】:
更新:见帖子底部 (这最初是在我们使用 SF 2.3 时发布的,我们现在使用的是 2.7.0)
我们的服务器上运行了多个 Symfony 应用程序,但由于所有原则性 ORM 缓存条目都以“sf2”为前缀,因此我们似乎在站点之间受到了缓存污染。
从过去 30 分钟的谷歌搜索来看,似乎没有一个简单的解决方案。
第一个建议使用 ProjectConfiguration.class.php - 但这似乎是 Symfony 1 的事情。
下一个可能的解决方案是使用 ApcUniversalClassLoader 类(根据 SO 上的这个问题:Multiple Symfony2 Sites using APC Cache)。
问题是我们的设置使用 composer 来自动加载,所以我们不能简单地使用该示例中的代码。
APC的类缓存端没问题,可以在前端控制器设置key,但是没有设置doctrine缓存的key。
有没有人有任何想法,因为目前我们不得不在除第一个应用程序之外的所有应用程序上禁用 APC。
前端控制器:
<?php
use Symfony\Component\ClassLoader\ApcClassLoader;
use Symfony\Component\HttpFoundation\Request;
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('app_1', $loader);
$loader->register(true);
require_once __DIR__.'/../app/AppKernel.php';
$kernel = new AppKernel('prod', false);
$kernel->loadClassCache();
// wrap the default AppKernel with the AppCache one
require_once __DIR__.'/../app/AppCache.php';
$kernel = new AppCache($kernel);
Request::enableHttpMethodParameterOverride();
$request = Request::createFromGlobals();
$response = $kernel->handle($request);
$response->send();
$kernel->terminate($request, $response);
-- 澄清-- 澄清一下,上面的代码引用了类的 APC 缓存,这和上面一样工作,很好。我们似乎无法更改的是原则 ORM APC 条目的默认命名空间,这些似乎是固定的,因此与每个正在运行的实例发生冲突。
-- 更新--
在尝试了 Zerrvox 设置命名空间的建议后,它似乎不起作用,主缓存仍在使用默认命名空间。如果在清除缓存时随机生成它们也不会那么糟糕,但是我的 vagrant box 和 live box 上的默认命名空间是相同的,并且缓存是在单独的盒子上生成的,所以它显然不是随机的。
缓存中 appProdProjectContainer 类中的这些方法仍然引用默认命名空间。
protected function getDoctrineCache_Providers_Doctrine_Orm_DefaultMetadataCacheService()
{
....
$instance->setNamespace('sf2orm_default_9e755ef08ba52b507455ecd06d0a648985c9593b15aca1522b4725acaaf77ce6');
return $instance;
}
// Same for...
protected function getDoctrineCache_Providers_Doctrine_Orm_DefaultQueryCacheService
protected function getDoctrineCache_Providers_Doctrine_Orm_DefaultResultCacheService
【问题讨论】:
标签: php symfony caching doctrine-orm