2015-01-13 5 views
0

Opcache를 실행하는 동안 Capistrano를 통해 새 PHP 코드를 배포하려고합니다.Opcache를 실행할 때 새 PHP 코드 배포

Capistrano는 배포 할 때마다 새로운 deploy 디렉토리를 만들고 웹 서버가 새 디렉토리를 가리 키도록 심볼릭 링크를 조정합니다. Opcache는 파일의 실제 경로로 캐시하기 때문에 새로 배포 된 사이트 버전은 이전 버전과 완전히 별도로 캐시됩니다.

우리가 실행하고있는 문제는 각각의 새로운 배포로 인해 전체 코드베이스가 캐싱되고 오래된 코드가 제거되지 않기 때문에 Opcache가 메모리를 모두 소모한다는 것입니다. opcache_reset()이라고 부를 수는 있지만 캐시가 재설정되면 캐시가 멈추었을 때 간단히 500 개의 오류가 발생합니다. (캐시를 워밍업하지 않고 새로운 배치를 시작하려고해도 같은 오류가 발생합니다.)

더 나은 방법이 있습니까? opcache가 메모리가 부족해질 때까지 (또는 파일이 너무 많아서 비울 때까지) 새로운 코드를 실행하는 방식으로 라이브 사이트에서 opcache_reset()을 호출하는 것을 피할 수 있습니까? 우리는 PHP 요청을 처리하는 PHP-FPM을 사용하여 Nginx를 웹 서버로 사용하고 있습니다.

+0

T0xicCode의 대답에 대해 설명했듯이 이전 버전의 op_arrays는 재설정으로 회수 할 때까지 데드 스페이스입니다. 그 트릭은 앱의 복사본을 두 장 보유하고 일일로드 사이클의 무덤 이동 부분에서 리셋을 수행 할 수있을만큼 캐시를 크게 차지하게하는 것입니다. – TerryE

답변

1

배포 마지막에 사이트의 이전 버전에있는 각 파일에 대해 opcache_invalidate을 호출하는 옵션이 있습니다. 무효화 다음에 파일을 포함시켜 캐시 스탬프를 방지 할 수 있습니다.

두 번째 옵션은 fpm이 여러 풀을 갖도록 설정하고 하나씩 다시 시작하는 것입니다 (클린 opcache로 시작합니다). 캐시 우표를 어느 정도 방지 할 수 있습니다. 단 하나의 서버 만 캐시를 깨끗하게 유지할 수 있으며 nginx는 다양한 풀의로드 균형을 조정할 수 있기 때문에 응용 프로그램이 계속 작동됩니다.

또 다른 옵션은 이전 버전의 스크립트를 삭제하여 revalidate_freq가 통과되면 opcache가 캐시에서 삭제하도록하여 파일 시스템에서 새 파일을로드하도록합니다.

+0

OPcache가 자원 재사용 모델을 사용하지 않으므로 invalidate를 사용하면이 유스 케이스에서는 도움이되지 않습니다. 이 공간은 리셋이 실행되거나 ini 설정에 의해 트리거 될 때까지 작동하지 않습니다. – TerryE