PHP 의 깊이 있 는 학습 Yii 2 캐 시 캐 시 구성 요소 상세 설명

9325 단어 PHPYii2캐 시
캐 시 구성 요소 Cache 가 무엇 입 니까?
캐 시 는 웹 응용 성능 을 향상 시 키 는 간편 하고 효과 적 인 방법 입 니 다.상대 적 으로 정적 인 데 이 터 를 캐 시 에 저장 하고 요청 을 받 았 을 때 캐 시 를 되 찾 으 면 프로그램 은 이 데 이 터 를 다시 만 드 는 데 필요 한 시간 을 절약 할 수 있 습 니 다.
在这里插入图片描述
캐 시 구성 요소 정의
Yii 2 의 캐 시 는 구성 요소 Component 를 통 해 이 루어 집 니 다.프로젝트 의 설정 파일 에서 components->cache 를 설정 하여 캐 시 구성 요소 에 대한 정 의 를 실현 합 니 다.
프로젝트 프로필 의 경 로 는 config/web.php 입 니 다.
在这里插入图片描述
페이지 캐 시 페이지 캐 시
사이트 로 서 Yii 2 의 페이지 캐 시 는 이미 보 여 준 웹 결 과 를 편리 하 게 저장 하고 캐 시 주기 내 에 페이지 내부 의 컨트롤 러 동작 논 리 를 다시 처리 할 필요 가 없습니다.
페이지 캐 시 설정
페이지 캐 시 설정 방식 은 컨트롤 러 층 Controller 에 행동 behaviors 를 설정 하고 필터 filers 를 호출 하 는 방식 으로 구체 적 인 페이지 경로 action 에 들 어가 기 전에 현재 key 를 계산 하고 캐 시가 enabled 캐 시 유효기간 duration 을 사용 하 는 지 판단 하 는 것 입 니 다.
기본 설정 코드 는 다음 과 같 습 니 다.

        return [
            'pageCache' => [
                'class' => 'yii\filters\PageCache',
                'only' => ['index'],
                'variations' => [
                    '/',
                    Yii::$app->request->isAjax,
                ],
                'enabled'=>true,
                'duration' => Yii::$app->params['pageCacheDuration'],
            ],
        ];
필 터 는 Yii 2 의 개념 입 니 다.그 는 컨트롤 러 가 초기 화 될 때 불 러 오고 실행 할 수 있 습 니 다.우 리 는 이 특징 으로 컨트롤 러 의 데이터 에 대한 제한 을 할 수 있 습 니 다.예 를 들 어 캐 시 제어,사용자 권한 제어 등 입 니 다.
여기 서 우 리 는 행동 이름 을 pageCache 로 정의 합 니 다.분명히 이름 은 중요 하지 않 습 니 다.어떤 사례 에서 서로 다른 페이지 캐 시 규칙 이 다 르 기 때문에 저 는 두 페이지 캐 시 행 위 를 정의 할 것 입 니 다.
그 중에서 only 는 필터 에 action 의 인 자 를 호출 합 니 다.어떤 경 로 를 action 을 사용 하 는 지 제한 하 는 데 사 용 됩 니 다.
페이지 캐 시 PageCache 는 캐 시 구성 요소 Cache 의 응용 프로그램 입 니 다.
페이지 캐 시 의 기본 논 리 는?
  • 캐 시 구성 요소 의 실현 을 설정 합 니 다.예 를 들 어 파일 캐 시 yii\caching\FileCache
  • 페이지 캐 시 는 Cache 구성 요 소 를 패키지 하고 액세스 논 리 를 호출 합 니 다
  • 우 리 는 페이지 캐 시 소스 코드 vendor/yiisoft/yii 2/filers/PageCache.php 를 볼 수 있 습 니 다.우 리 는 파일 의 162 줄 에서 여기 서 호출 된 cache 가 바로 캐 시 에 대한 실현 임 을 발견 할 수 있 습 니 다.
    
    $this->cache = Instance::ensure($this->cache, 'yii\caching\CacheInterface');
    
    사용자 정의 페이지 캐 시 필터
    왜 우 리 는 캐 시 구성 요 소 를 사용자 정의 해 야 합 니까?나 는 다음 과 같은 몇 가지 원인 이 존재 합 니 다.
  • 캐 시 판단 논리 가 너무 간단 하거나 복잡 해서 자신 이 다시 쓰 는 것 보다 시원 하 게 쓰 는 것 이 낫다
  • 캐 시 키 생 성 방식 이 업무 수 요 를 만족 시 키 지 못 합 니 다
  • 그럼 어떻게 사용자 정의 할 까요?저 는 개인 적 으로 가장 간단 하고 거 친 방식 으로 계승 하 는 것 을 추천 합 니 다.
    
    use yii\filters\PageCache;
    
    class PageCacheCtInfo extends PageCache
    {
    	       ,            。
    	public $checkUser = true; //       
    }
    호출 방식 도 기본 페이지 캐 시 와 마찬가지 로 해당 하 는 클래스 만 바 꾸 면 됩 니 다.
    
                'pageCacheInfo' => [
                    'class' => 'common\components\PageCacheCtInfo',
                    'only' => ['info'],
                    'enabled'=>Yii::$app->params['pageCacheEnabled'],
                    'variations' => [
                        'ct/'.Yii::$app->request->pathInfo,
                        Yii::$app->request->isAjax
                    ],
                    'duration' => Yii::$app->params['pageCacheInfo'],
                    'checkUser' = false,
                ],
    페이지 캐 시 키 계산
    이전 단계 에 따라 키 를 계산 하 는 방식 을 다시 쓸 수 있 습 니 다.그러면 이전의 키 계산 방식 은 어떻게 되 었 습 니까?
    파일 위치 vendor/yiisoft/yii 2/filers/PageCache.php.
    
        /**
         * @return array the key used to cache response properties.
         * @since 2.0.3
         */
        protected function calculateCacheKey()
        {
            $key = [__CLASS__];
            if ($this->varyByRoute) {
                $key[] = Yii::$app->requestedRoute;
            }
            return array_merge($key, (array)$this->variations);
        }
    
    여기 캐 시 키 는 하나의 배열 입 니 다.배열 안의 요 소 는 다음 과 같 습 니 다.
  • 현재 클래스 명
  • varyByRoute 는 일반적으로 true
  • 이다.
  • variations 검증,이것 도 설정 에서 가 져 온 것 입 니 다.위의 설정 에 따라 페이지 경로 와 ajax
  • 인지 여부 입 니 다.
    프로젝트 의 첫 페이지 라면 캐 시 키 는?
    
    ['yii\filters\PageCache','','/‘,0]
    자세 한 페이지 라면 key 는
    
    ['yii\filters\PageCach', 'xxx/info','xxx/xxx/3xxxx74.html',0 ]
    그럼 이 키 는 도대체 무슨 소 용이 있 는 거 야?왜 따로 꺼 내 서 말 하 는 거 야?
    페이지 캐 시 를 따로 삭제 해 야 하기 때 문 입 니 다.
    만 료 된 캐 시 를 주동 적 으로 청소 합 니 다.
    원본 코드 에 따라 vendor/yiisoft/yii 2/caching/FileCache.php
    
        /**
         * Stores a value identified by a key in cache.
         * This is the implementation of the method declared in the parent class.
         *
         * @param string $key the key identifying the value to be cached
         * @param string $value the value to be cached. Other types (If you have disabled [[serializer]]) unable to get is
         * correct in [[getValue()]].
         * @param int $duration the number of seconds in which the cached value will expire. 0 means never expire.
         * @return bool true if the value is successfully stored into cache, false otherwise
         */
        protected function setValue($key, $value, $duration)
        {
            $this->gc();
            $cacheFile = $this->getCacheFile($key);
            if ($this->directoryLevel > 0) {
                @FileHelper::createDirectory(dirname($cacheFile), $this->dirMode, true);
            }
            // If ownership differs the touch call will fail, so we try to
            // rebuild the file from scratch by deleting it first
            // https://github.com/yiisoft/yii2/pull/16120
            if (is_file($cacheFile) && function_exists('posix_geteuid') && fileowner($cacheFile) !== posix_geteuid()) {
                @unlink($cacheFile);
            }
            if (@file_put_contents($cacheFile, $value, LOCK_EX) !== false) {
                if ($this->fileMode !== null) {
                    @chmod($cacheFile, $this->fileMode);
                }
                if ($duration <= 0) {
                    $duration = 31536000; // 1 year
                }
    
                return @touch($cacheFile, $duration + time());
            }
    
            $error = error_get_last();
            Yii::warning("Unable to write cache file '{$cacheFile}': {$error['message']}", __METHOD__);
            return false;
        }
    
    캐 시 를 설정 하기 전에 캐 시 를 청소 하 는 방법 gc()를 주동 적 으로 호출 합 니 다.
    
        /**
         * Removes expired cache files.
         * @param bool $force whether to enforce the garbage collection regardless of [[gcProbability]].
         * Defaults to false, meaning the actual deletion happens with the probability as specified by [[gcProbability]].
         * @param bool $expiredOnly whether to removed expired cache files only.
         * If false, all cache files under [[cachePath]] will be removed.
         */
        public function gc($force = false, $expiredOnly = true)
        {
            if ($force || mt_rand(0, 1000000) < $this->gcProbability) {
                $this->gcRecursive($this->cachePath, $expiredOnly);
            }
        }
    이 문제 가 발생 했 습 니 다.$gcProbability 의 기본 값 은 10 입 니 다.즉,0.001%의 확률 만 캐 시 를 설정 하 는 동시에 만 료 된 캐 시 를 청소 합 니 다.
    없 는 거 랑 똑 같 잖 아!
    따라서 캐 시 에 있어 서 기한 이 지난 캐 시 를 자발적으로 정기 적 으로 정리 해 야 합 니 다.그렇지 않 으 면 해당 하 는 저장 공간 이 가득 차지 할 것 입 니 다.
    
    Yii::$app->cache->gc(true);
    캐 시 설정 최적화
    구성 요소 의 cache 는 프로젝트 설정 파일 에서 정의 합 니 다.
    
    'components' => ['cache' => [
        'class' => 'yii\caching\FileCache',
    ],],
    여기 서 자유도 가 나 타 났 습 니 다.현재 이 설정 은 파일 캐 시 입 니 다.즉,데이터 캐 시 든 페이지 캐 시 든 모두 파일 에 저 장 됩 니 다.
    원본 코드 Public$cachePath='@runtime/cache';
    캐 시 된 파일 은 runtime/cache 폴 더 에 있 습 니 다.
    그러면 문제 가 발생 합 니 다.디스크 의 성능 은 병목 이 있 고 파일 읽 기와 쓰 기 는 캐 시 성능 에 영향 을 줄 수 있 습 니 다.
    현재 선택 한 캐 시 는
  • yii\\caching\\ApcCache,APC 확장
  • yii\\caching\\DbCache,데이터베이스 캐 시
  • yii\caching\Dummy Cache,가짜 캐 시,바로 지금 조건 없 이 캐 시 를 먼저 차지 하 는 것 입 니 다
  • yii\\caching\\FileCache,파일 캐 시
  • yii\caching\MemCache,PHP memcache 와 memcached 확장 사용
  • yii\redis\Cache,redis
  • yii\\caching\\WinCache,PHP WinCache 확장 사용
  • yii\\caching\\XCache,PHP XCache 확장 사용
  • yii\\caching\\ZendDataCache,Zend Data Cache 사용
  • 총결산
    저 는 본 논문 에서 점진 적 인 방식 으로 Yi 2 의 캐 시 구성 요 소 를 어떻게 사용 하 는 지 에 대해 말씀 드 렸 습 니 다.일반 사용자 에 게 9 할 이 넘 는 구 덩이 를 포함 하고 있 습 니 다.
    만약 당신 이 PHP 를 배우 고 있다 면,이 글 을 소장 하 는 것 이 앞으로 도움 이 될 것 입 니 다.
    在这里插入图片描述
    PHP 의 깊이 있 는 학습 Yii 2 캐 시 캐 시 캐 시 캐 시 구성 요소 에 대한 자세 한 설명 은 여기까지 입 니 다.더 많은 관련 PHP 의 깊이 있 는 학습 Yii 2 캐 시 캐 시 캐 시 구성 요소 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 저 를 많이 사랑 해 주세요!

    좋은 웹페이지 즐겨찾기