2015-02-02 3 views
4
와 교리 APC 캐시 접두사를 설정하는 방법

업데이트 : 포스트 의 바닥 (이것은 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 

답변

3

Doctrine Annotations를 사용하여 doctrine ORM 캐시 또는 주석 캐시에 대해 언급하고 있는지 여부는 지정하지 않습니다. 업데이트 - -

당신이를 지정 했

app.doctrine.apc_cache: 
     class: Doctrine\Common\Cache\ApcCache 
     calls: 
      - [setNamespace, ["app_namespace"]] 

어쨌든이 (YML) 같은 심포니에 서비스를 정의하여 모두에 사용할 수있는 자신 만의 APC 캐시 서비스를 만들 수 있습니다 교리에 대한 메타 데이터 캐시로 정의 된 서비스. Doctrine 번들 구성에 대한 설정 참조를 참조하십시오. http://symfony.com/doc/current/reference/configuration/doctrine.html#caching-drivers

doctrine: 
     orm: 
      metadata_cache_driver: 
       type: service 
       id: app.doctrine.apc_cache 
+0

죄송합니다 - 예, 나는 모든 교리 문을 전혀 의미하지 않았습니다.즉, 클래스 캐시가 수행하는 방식과 유사하게 파일의 경로와 관련된 키로 주석을 캐시 할 수 있습니까? 그렇다면 두 개의 심포니 설치가 다른 디렉토리에 있기 때문에 그들은 이미 유일 할 것입니다. 어쨌든 솔루션을 사용해 보겠습니다. 답장을 보내 주셔서 감사합니다. –

+0

Zerrvox - 업데이트 된 게시물보기, 내가 코멘트에 필요한 것을 게시 할 수 없습니다. –

+1

캐싱 서비스를 사용하도록 doctrine을 구성하는 방법을 포함하도록 내 대답을 업데이트했습니다. – Zerrvox

관련 문제