2013-11-27 2 views
0

app/console 캐시 : clear가 응용 프로그램 캐시를 사용할 때 재배포 후 큰 문제로 이어질 수있는 XCache (또는 APC)를 지우지 않음 app.php (예 : bootstrap.php .cache 및 기타 모든 생성 된 .cache. 파일이 캐시됩니다. 안정적으로 다시 배포에 캐시를 취소 할 수있는 방법이 없습니다 그래서 우리의 설치가 "응용 프로그램"서버 4에 분산되어symfony2 : 배포시 여러 인스턴스에서 XCache 클래스 캐시 플러시

$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); 

app.php (꽤 기본값). 우리가 필요로하는 것은 우리 환경의 모든 서버에게 PHP/XCache를 플러시하도록 알려주는 방법입니다. APCBundle https://github.com/ornicar/ApcBundle은 그런 식으로 보이지만 APC에서만 작동합니다.

관련 문제는 doctrine:cache:clear-query 또는 clear-metadata 명령을 사용 중입니다. ORM 메타 데이터에 대한 캐시 구현으로 XCache를 사용할 때 "모든 메타 데이터 캐시 항목 지우기"( 캐시 항목을 성공적으로 삭제했습니다.) 명령이 실제로 아무 것도 플러시하지 않습니다. -> XCache 관리자를 살펴보면 모든 것이 여전히 있다는 것을 알 수 있습니다. 이것은 Symfony 명령이 PHP CLI 환경에서 실행되기 때문에 실제로 기대됩니다. 다시 APC 번들은 캐시를 올바르게 플러시합니다.

a) 명령에서 모든 것이 플러시되었거나 뭔가 빠졌다고 말하는 것이 "버그"입니까? b) 모든 서버에서 어떻게 이러한 캐시를 안정적으로 플러시 할 수 있습니까? c) APCBundle과 유사한 솔루션을 작성한 사람이 누구나 있으며 이러한 문제를 처리하는 모범 사례를 제시 할 수 있습니까? d) 다시 배포 한 후에 각 Apache를 다시 시작하는 것이 더 쉽습니다. (아무리 길더라도 시스템 관리자가 저 아이디어를 죽일 것입니다.)

답변

2

여러 인스턴스가있는 경우 중앙 집중식 캐시 저장소 세션을 유지하기 위해 SncRedisBundle을 통해 Redis, 교리 메타 및 쿼리 캐시). 이러한 방식으로 배포 프로세스의 마지막 단계로 교리 메타 데이터 또는 쿼리 캐시를 한 번 삭제해야합니다.

배포 전략은 여러 가지가 있지만 모두 Apache를 다시 시작하면이 트릭을 수행합니다. 비록 당신이 그것을 어떻게하는지에 관한 많은 대안이있다. : 당신은 새로운 코드 (drop과 warmup cache)를 가진 인스턴스로 오래된 코드를 가진 인스턴스를 교체 할 수있다. 또는 (로드 밸런서를 사용하는 경우) 새 인스턴스를 그룹에 추가하고 이전 인스턴스를 제거 할 수 있습니다.

php-fpm (지금 몇 년 동안 Apache를 사용하지 않음)을 재시작하면 APC가 즉시 사라지고 매우 안정적으로 작동하며 가동 중지 시간도 전혀 없습니다.

질문이 있으시면 언제든지 물어보십시오.

+0

예, 실제로 Memcache를 결과 캐시 계층으로 사용했습니다 (이미 있고 잘 작동합니다). 그러나 엔티티 메타 데이터와 DQL> SQL 변환을 캐시하기 위해서는 xcache만으로 충분할 것입니다. 주요 문제는 "클래스"캐시이지만, 플러시하지 않는 한 오래된 정의가 유지됩니다. Redis에서 opcode를 캐시 할 수 있다고 생각하지 않습니다. :) – Stefan

+1

그렇다면 PHP-fpm (또는 귀하의 경우에는 Apache)을 다시 시작하십시오. 물론, opcode에 대한 redis :) –

+0

우리의 관리자는 여전히 당신이 당신의 웹 서버를 다시 시작해서는 안 믿는 말해 :( – Stefan