업데이트 : 포스트 의 바닥 (이것은 orginially 우리가 SF 2.3을 사용했을 때, 우리는 2.7.0 지금이야 게시)Symfony2 - 여러 응용
를 참조하십시오Google 서버에서 여러 개의 Symfony 앱을 실행하고 있지만, 모든 교리 ORM 캐시 항목 앞에 'sf2'접두사가 있기 때문에 사이트 전체에서 캐시 오염이 발생하는 것 같습니다.
지난 30 분 동안 인터넷을 검색 한 결과, 쉬운 해결책이없는 것 같습니다.
첫 번째 것은 ProjectConfiguration.class.php를 사용하여 제안되었지만 Symfony 1 것 같습니다.
다음으로 가능한 해결책은 ApcUniversalClassLoader 클래스를 사용하는 것입니다 (SO : Multiple Symfony2 Sites using APC Cache에 대한이 질문에 따라).
문제는 설치 프로그램에서 작성자를 사용하여 자동로드하므로 해당 예제에 따라 코드를 단순히 사용할 수 없다는 것입니다.
APC의 클래스 캐싱 측면은 좋지만 프런트 컨트롤러에서 키를 설정할 수는 있지만 doctrine 캐시의 키는 설정하지 않습니다.
아무도 생각을 가지고 있지 않습니다. 현재로서는 첫 번째 앱을 제외한 모든 앱에서 APC를 사용 중지해야합니다.
는을 FrontController :
<?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의 제안을 시도 후에는, 주요 캐시는 여전히 기본 네임 스페이스를 사용하고 작동하지 않았다. 캐시가 지워졌을 때 무작위로 생성되었지만 기본 이름 공간이 내 방앗간 상자와 라이브 상자 모두에서 동일하고 캐시가 별도의 상자에서 생성되었으므로 그렇게 나쁘지는 않을 것입니다.
캐시의 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
죄송합니다 - 예, 나는 모든 교리 문을 전혀 의미하지 않았습니다.즉, 클래스 캐시가 수행하는 방식과 유사하게 파일의 경로와 관련된 키로 주석을 캐시 할 수 있습니까? 그렇다면 두 개의 심포니 설치가 다른 디렉토리에 있기 때문에 그들은 이미 유일 할 것입니다. 어쨌든 솔루션을 사용해 보겠습니다. 답장을 보내 주셔서 감사합니다. –
Zerrvox - 업데이트 된 게시물보기, 내가 코멘트에 필요한 것을 게시 할 수 없습니다. –
캐싱 서비스를 사용하도록 doctrine을 구성하는 방법을 포함하도록 내 대답을 업데이트했습니다. – Zerrvox