更新:请见本文底部(此文章最初发布时我们使用的是 SF 2.3,现在我们已经升级到 2.7.0)
我们的服务器上运行着多个 Symfony 应用程序,但由于所有 doctrine ORM 缓存条目都以“sf2”为前缀,似乎在这些网站之间存在缓存污染。
从过去30分钟的谷歌搜索中得知,似乎没有简单的解决方案。
首先建议使用 ProjectConfiguration.class.php,但那似乎只适用于 Symfony 1。
下一个可能的解决方案是使用 ApcUniversalClassLoader 类(如此问题中所述:Multiple Symfony2 Sites using APC Cache)。
问题是我们的设置使用 composer 进行自动加载,因此我们不能像那个例子一样简单地使用代码。
APC 的类缓存功能很好,你可以在前端控制器中设置键,但它不会为 doctrine 缓存设置键。
请问有人有什么想法吗?因为目前我们只能在第一个应用程序上禁用 doctrine 的 APC。
前端控制器:
我们的服务器上运行着多个 Symfony 应用程序,但由于所有 doctrine ORM 缓存条目都以“sf2”为前缀,似乎在这些网站之间存在缓存污染。
从过去30分钟的谷歌搜索中得知,似乎没有简单的解决方案。
首先建议使用 ProjectConfiguration.class.php,但那似乎只适用于 Symfony 1。
下一个可能的解决方案是使用 ApcUniversalClassLoader 类(如此问题中所述:Multiple Symfony2 Sites using APC Cache)。
问题是我们的设置使用 composer 进行自动加载,因此我们不能像那个例子一样简单地使用代码。
APC 的类缓存功能很好,你可以在前端控制器中设置键,但它不会为 doctrine 缓存设置键。
请问有人有什么想法吗?因为目前我们只能在第一个应用程序上禁用 doctrine 的 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缓存,这很好地完成了任务。我们似乎无法更改Doctrine ORM APC条目的默认命名空间,因为这些命名空间是固定的,会与每个运行实例发生冲突。
-- 更新 --
尝试了Zerrvox的建议设置命名空间后,仍然没有起作用,主要缓存仍在使用默认命名空间。如果缓存被清除时默认命名空间是随机生成的话,那么情况就不会太糟糕,但是默认命名空间在我的vagrant盒子和实际环境中都相同,并且缓存是在不同的盒子上生成的,所以显然不是随机的。
这些方法在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