페이지 캐싱
페이지 캐싱이란 페이지 전체의 내용을 서버측에서 캐싱하는 것을 말합니다. 이후에 동일한 페이지가 요청되면 콘텐츠가 다시 생성되지 않고 캐시에서 가져옵니다.
페이지 캐싱은 필터인 yiifiltersPageCache 클래스에서 지원됩니다. 다음과 같이 컨트롤러 클래스에서 사용할 수 있습니다.
public function behaviors() { return [ [ 'class' => 'yii\filters\PageCache', 'only' => ['index'], 'duration' => 60, 'variations' => [ \Yii::$app->language, ], 'dependency' => [ 'class' => 'yii\caching\DbDependency', 'sql' => 'SELECT COUNT(*) FROM post', ], ], ]; }
위 코드는 페이지 캐싱이 인덱스 작업 중에만 활성화됨을 나타냅니다. 페이지 콘텐츠는 최대 60초 동안 캐시되며 현재 애플리케이션의 언어가 변경되면 변경됩니다. 총 기사 수가 변경되면 캐시된 페이지가 무효화됩니다.
보시다시피 페이지 캐싱과 프래그먼트 캐싱은 매우 유사합니다. 모두 기간, 종속성, 변형 및 활성화된 구성 옵션을 지원합니다. 이들 사이의 주요 차이점은 페이지 캐싱은 필터로 구현되는 반면 조각 캐싱은 위젯이라는 것입니다.
페이지 캐싱과 동시에 프래그먼트 캐싱과 동적 콘텐츠를 사용할 수 있습니다.
HTTP 캐시
서버측 캐싱 외에도 웹 애플리케이션은 클라이언트측 캐싱을 사용하여 동일한 페이지 콘텐츠를 생성하고 전송하는 데 드는 시간을 절약할 수 있습니다.
yiifiltersHttpCache 필터를 구성하면 컨트롤러 작업으로 렌더링된 콘텐츠를 클라이언트에 캐시할 수 있습니다. yiifiltersHttpCache 필터는 GET 및 HEAD 요청에만 적용되며 이러한 요청에 대해 3개의 캐시 관련 HTTP 헤더를 설정할 수 있습니다.
최종 수정 헤더
Last-Modified 헤더는 타임스탬프를 사용하여 클라이언트가 마지막으로 캐시한 이후 페이지가 수정되었는지 여부를 나타냅니다.
yiifiltersHttpCache::lastModified 속성을 구성하여 Last-Modified 헤더를 클라이언트에 보냅니다. 이 속성의 값은 PHP 호출 가능 유형이어야 하며 페이지가 수정되었을 때 Unix 타임스탬프를 반환합니다. 이 콜러블의 매개변수와 반환 값은 다음과 같아야 합니다.
/** * @param Action $action 当前处理的操作对象 * @param array $params “params” 属性的值 * @return integer 页面修改时的 Unix 时间戳 */ function ($action, $params)
다음은 Last-Modified 헤더를 사용한 예입니다.
public function behaviors() { return [ [ 'class' => 'yii\filters\HttpCache', 'only' => ['index'], 'lastModified' => function ($action, $params) { $q = new \yii\db\Query(); return $q->from('post')->max('updated_at'); }, ], ]; }
위 코드는 HTTP 캐싱이 인덱스 작업 중에만 활성화됨을 나타냅니다. 페이지의 마지막 수정 시간을 기반으로 Last-Modified HTTP 헤더를 생성합니다. 브라우저가 처음으로 인덱스 페이지에 액세스하면 서버는 페이지를 생성하여 클라이언트 브라우저로 보냅니다. 나중에 페이지가 수정되지 않은 동안 클라이언트 브라우저가 페이지에 액세스하면 서버는 페이지를 다시 생성하지 않으며 브라우저는 이전 클라이언트가 캐시한 콘텐츠를 사용합니다. 따라서 서버측 렌더링 및 콘텐츠 전송은 생략됩니다.
ETag 헤더
"엔티티 태그"(줄여서 ETag)는 해시 값을 사용하여 페이지 콘텐츠를 나타냅니다. 페이지가 수정되면 해시 값도 변경됩니다. 클라이언트 측 해시 값과 서버 측에서 생성된 해시 값을 비교함으로써 브라우저는 페이지가 수정되었는지 여부를 판단하고 콘텐츠를 재전송해야 하는지 여부를 결정할 수 있습니다.
yiifiltersHttpCache::etagSeed 속성을 구성하여 ETag 헤더를 클라이언트에 보냅니다. 이 속성의 값은 PHP 호출 가능 유형이어야 하며 ETag 해시 값을 생성하는 데 사용되는 시드 문자를 반환합니다. 이 콜러블의 매개변수와 반환 값은 다음과 같아야 합니다.
/** * @param Action $action 当前处理的操作对象 * @param array $params “params” 属性的值 * @return string 一段种子字符用来生成 ETag 哈希值 */ function ($action, $params)
다음은 ETag 헤더를 사용한 예시입니다.
public function behaviors() { return [ [ 'class' => 'yii\filters\HttpCache', 'only' => ['view'], 'etagSeed' => function ($action, $params) { $post = $this->findModel(\Yii::$app->request->get('id')); return serialize([$post->title, $post->content]); }, ], ]; }
위 코드는 HTTP 캐싱이 보기 작업 중에만 활성화됨을 나타냅니다. 사용자 요청의 헤더와 콘텐츠를 기반으로 ETag HTTP 헤더를 생성합니다. 브라우저가 처음으로 보기 페이지에 액세스하면 서버는 페이지를 생성하여 클라이언트 브라우저로 보냅니다. 이후 해당 기간 동안에는 클라이언트 브라우저 제목과 콘텐츠가 수정되지 않고 해당 페이지에 접속됩니다. 서버는 해당 페이지를 재생성하지 않으며, 브라우저는 이전 클라이언트에서 캐시한 콘텐츠를 사용하게 됩니다. 따라서 서버측 렌더링 및 콘텐츠 전송은 생략됩니다.
ETag는 Last-Modified보다 더 복잡하고 정확한 캐싱 전략을 구현할 수 있습니다. 예를 들어 사이트가 다른 테마로 전환되면 ETag가 무효화될 수 있습니다.
복잡한 Etag 생성 시드는 HttpCache를 사용하는 원래 목적을 무너뜨리고 불필요한 성능 오버헤드를 유발할 수 있습니다. 각 요청에 대한 응답으로 Etag를 다시 계산해야 하기 때문입니다. Etag 실패를 유발하는 가장 간단한 표현을 찾아보십시오.
참고: RFC 7232(HTTP 1.1 프로토콜)를 준수하기 위해 ETag 및 Last-Modified 헤더가 모두 구성된 경우 HttpCache는 이를 동시에 보냅니다. 그리고 클라이언트가 If-None-Match 헤더와 If-Modified-Since 헤더를 모두 보내는 경우 전자만 허용됩니다.
캐시 제어 헤더
Cache-Control 헤더는 페이지에 대한 일반적인 캐싱 전략을 지정합니다. yiifiltersHttpCache::cacheControlHeader 속성을 설정하여 해당 헤더 정보를 전송할 수 있습니다. 기본적으로 다음 헤더가 전송됩니다.
Cache-Control: public, max-age=3600
세션 캐시 제한
페이지에서 세션을 사용하는 경우 PHP는 PHP.INI에 설정된 session.cache_limiter 값에 따라 일부 캐시 관련 HTTP 헤더를 자동으로 보냅니다. 이러한 HTTP 헤더는 원래 설정한 HttpCache를 방해하거나 무효화할 수 있습니다. 이 문제를 방지하기 위해 HttpCache는 기본적으로 이러한 헤더의 자동 전송을 비활성화합니다. 이 동작을 변경하려면 yiifiltersHttpCache::sessionCacheLimiter 속성을 구성하면 됩니다. 이 속성은 public, private, private_no_expire 및 nocache를 포함한 문자열 값을 허용합니다. 이러한 값의 의미는 PHP 매뉴얼의 캐시 제한기를 참조하세요.
SEO 영향
검색 엔진은 사이트의 캐시 헤더를 따르는 경향이 있습니다. 일부 크롤러의 크롤링 빈도는 제한되어 있으므로 캐시 헤더를 활성화하면 반복 요청 수를 줄이고 크롤러 크롤링 효율성을 높일 수 있습니다.