PHP 의 깊이 있 는 학습 Yii 2 캐 시 캐 시 구성 요소 상세 설명
캐 시 는 웹 응용 성능 을 향상 시 키 는 간편 하고 효과 적 인 방법 입 니 다.상대 적 으로 정적 인 데 이 터 를 캐 시 에 저장 하고 요청 을 받 았 을 때 캐 시 를 되 찾 으 면 프로그램 은 이 데 이 터 를 다시 만 드 는 데 필요 한 시간 을 절약 할 수 있 습 니 다.
캐 시 구성 요소 정의
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 의 응용 프로그램 입 니 다.
페이지 캐 시 의 기본 논 리 는?
$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);
}
여기 캐 시 키 는 하나의 배열 입 니 다.배열 안의 요 소 는 다음 과 같 습 니 다.프로젝트 의 첫 페이지 라면 캐 시 키 는?
['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 폴 더 에 있 습 니 다.
그러면 문제 가 발생 합 니 다.디스크 의 성능 은 병목 이 있 고 파일 읽 기와 쓰 기 는 캐 시 성능 에 영향 을 줄 수 있 습 니 다.
현재 선택 한 캐 시 는
저 는 본 논문 에서 점진 적 인 방식 으로 Yi 2 의 캐 시 구성 요 소 를 어떻게 사용 하 는 지 에 대해 말씀 드 렸 습 니 다.일반 사용자 에 게 9 할 이 넘 는 구 덩이 를 포함 하고 있 습 니 다.
만약 당신 이 PHP 를 배우 고 있다 면,이 글 을 소장 하 는 것 이 앞으로 도움 이 될 것 입 니 다.
PHP 의 깊이 있 는 학습 Yii 2 캐 시 캐 시 캐 시 캐 시 구성 요소 에 대한 자세 한 설명 은 여기까지 입 니 다.더 많은 관련 PHP 의 깊이 있 는 학습 Yii 2 캐 시 캐 시 캐 시 구성 요소 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 저 를 많이 사랑 해 주세요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
laravel에 yo에서 angularJs&coffeescript를 사용할 수 있도록 한다.먼저 yo 명령을 사용할 수 있어야하므로 아래에서 설치 global에 설치한 곳에서 laravel의 프로젝트 루트로 이동. 클라이언트 코드를 관리하는 디렉토리를 만들고 이동합니다. 클라이언트 환경 만들기 이것으로 히...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.