HTTP 캐시


Diff이 글은 BOOK에서 파생되었으며, 기존 공식 문서와 다릅니다. 이 기사에서는 일부 위치에서 이에 대해 더 깊이 있고 자세히 설명합니다. 따라서 우리는 관계자와의 동기화를 강요하지 않았습니다.

리치 웹 애플리케이션의 특성은 동적이라는 것입니다. 프로그램이 아무리 효율적이더라도 각 요청은 항상 정적 파일보다 훨씬 더 큰 오버헤드를 부담하게 됩니다.

그리고 더 많은 웹 프로그램은 큰 영향을 받지 않았습니다. Symfony는 매우 빠르며, 매우 강력한 작업을 수행하지 않는 한 서버에 너무 많은 스트레스를 주지 않고 모든 요청이 신속하게 복원됩니다.

하지만 사이트가 성장하고 있어 과부하가 문제가 될 수 있습니다. 일반적인 요청 처리는 한 번만 수행되어야 합니다. 이것이 바로 캐시 잠금의 목표입니다.

거인의 어깨에 캐싱

프로그램 성능을 향상시키는 가장 효과적인 방법은 프로그램의 모든 출력을 캐시하는 것입니다. 페이지를 클릭한 다음 전체 후속 요청을 무시하세요. 물론 매우 동적인 웹사이트의 경우 항상 그런 것은 아닙니다. 이 장에서는 Symfony의 캐싱 시스템이 어떻게 작동하는지, 그리고 이것이 왜 최고의 솔루션인지 배우게 됩니다.

Symfony 캐싱 시스템은 HTTP 사양에 정의된 HTTP 캐시의 단순성과 성능에 의존하기 때문에 다릅니다. 캐싱 접근 방식을 재창조하는 대신 Symfony는 웹에서의 기본 통신을 정의하는 표준을 강조합니다. "HTTP 유효성 검사"와 "캐시된 ​​모델 만료"의 기본 사항을 마스터하면 이미 Symfony의 캐싱 시스템을 마스터할 수 있습니다.

Symfony 캐싱 학습 과정은 4단계로 나눌 수 있습니다:

  1. gateway 캐시#🎜🎜 # 또는 역순 프록시는 애플리케이션 앞의 별도 레이어입니다. 역방향 프록시는 프로그램에서 반환할 때 응답을 캐시합니다. 요청이 프로그램에 도달하기 전에 캐시된 응답으로 요청에 응답할 수도 있습니다. Symfony는 자체 역방향 프록시를 제공하지만 모든 역방향 프록시가 작동합니다.

  2. HTTP 캐시HTTP 캐시 헤더는 프로그램과 클라이언트 간에 사용되며 게이트웨이 캐시 또는 기타 캐시 통신과 통신하는 데 사용됩니다. Symfony는 캐시 헤더와 상호 작용하기 위한 합리적인 기본 구성과 강력한 인터페이스를 제공합니다.

  3. HTTP

    만료 및 유효성 검사(만료 및 유효성 검사) , 이 두 모델은 캐시된 콘텐츠가 인지 확인하는 데 사용됩니다. Fresh/fresh(캐시에서 재사용 가능) 또는 stale/stale(프로그램에서 재생성해야 함)

  4. #🎜 🎜#
  5. Edge Side Contains(ESI)

    , Edge Side Contains를 사용하면 페이지 일부(중첩된 조각도 포함)를 독립적으로 캐싱하는 데 HTTP 캐시를 사용할 수 있습니다. ESI의 도움으로 "전체 페이지를 60분 동안 캐시할 수 있지만 사이드바는 5분 동안만 캐시"할 수도 있습니다.

  6. HTTP 캐시는 Symfony 전용이 아니기 때문에 관련 글이 많습니다. HTTP 캐싱에 익숙하지 않다면 Ryan Tomayko의
Things Caches Do

를 읽어 보시기 바랍니다. 또 다른 훌륭하고 심층적인 기사는 Mark Nottingham의 Cache Tutorial 입니다.

게이트웨이 캐시 사용

HTTP 캐싱을 사용할 때 cache는 프로그램과 완전히 별개이며 프로그램 사이에 상주합니다. 그리고 요청을 하는 클라이언트.

캐싱 작업은 클라이언트 요청을 수신한 다음 이를 프로그램으로 다시 전달하고 다시 클라이언트로 푸시하는 것입니다. 여기서 캐시는 프로그램과 브라우저 간의 "요청-응답" 통신 프로세스에서 "중개자"입니다.

시간이 지남에 따라 이러한 캐시는 "캐시 가능"하다고 간주되는 모든 응답을 저장합니다(HTTP 캐시 소개 참조). 동일한 리소스가 다시 요청되면 캐시는 애플리케이션을 완전히 무시하고 캐시된 응답을 클라이언트에 보냅니다.

이 유형의 캐시는 HTTP 게이트웨이 캐시(게이트웨이 캐시)이며 역방향 프록시 모드에서 Varnish, Squid#🎜🎜 등의 위치에 존재합니다. #그리고 Symfony의 역방향 프록시.

캐시 유형

그러나 게이트웨이 캐시가 유일한 캐시 유형은 아닙니다. 실제로 프로그램에서 보낸 HTTP 캐시 헤더는 최대 세 가지 캐싱 방법으로 해석되는 것으로 가정됩니다: 캐시)

: 각 브라우저에는 자체 내장 로컬 캐시가 있으며, 이는 '뒤로'를 클릭할 때 사용됩니다. " 또는 이미지 및 기타 자산의 경우. 캐시된 리소스는 다른 사람이 사용할 수 없기 때문에 브라우저 캐시는 비공개(

private
    ) 캐시입니다(프록시 캐시).
  • : 프록시는 공유(

    shared를 나타냅니다. ) 캐시, 많은 사람들이 누군가를 팔로우할 수 있기 때문입니다. 일반적으로 대기업이나 ISP에서 액세스 대기 시간과 네트워크 트래픽을 줄이기 위해 사용합니다.

  • Gateway 캐시
  • : 프록시와 유사하며 공유 캐시이지만 서버 측에 있습니다. 네트워크 관리자가 웹 사이트를 더 쉽게 업그레이드하고, 더 안정적이고, 더 나은 성능을 발휘하도록 만들기 위해 자주 사용됩니다.

    게이트웨이 캐시는 때때로 역방향 프록시 캐시, 대리 캐시(프록시 캐시), 심지어 HTTP 가속기라고도 합니다.
  • 캐시된 응답에 특정 사용자에 대한 콘텐츠(예: 계정 정보)가 포함되어 있는 상황이 논의될 때 비공개( #🎜 🎜#private
  • ) 캐싱 및 공유(
shared
) 캐싱의 중요성은 날이 갈수록 커지고 있습니다.

프로그램의 모든 응답은 처음 두 가지 캐시 유형 중 하나 또는 둘 다를 경험하게 됩니다. 이러한 캐시는 귀하의 (프로그램) 제어 범위를 벗어나지만 응답에 설정된 HTTP 캐싱 지침을 따릅니다.

Symfony 역방향 프록시

Symfony에는 PHP로 작성된 역방향 프록시(게이트웨이 캐시라고도 함)가 내장되어 있습니다. Varnish처럼 모든 기능을 갖춘 역방향 프록시 캐시는 아니지만 좋은 시작입니다.

Varnish 설정에 대한 자세한 내용은 Varnish를 사용하여 웹사이트 속도를 높이는 방법 을 참조하세요.

프록시 활성화는 쉽습니다. Symfony 프로그램에는 기본 코어( < code>AppKernel)이 패키지되어 있습니다. 이 캐시 코어는 역방향 프록시입니다. AppCache),它把默认的核心(AppKernel)给打包。这个缓存核心就是 反向代理。

开启缓存很容易,修改你的前端控制器代码。你也可以在app_dev.php中做出这些改变,即可为dev环境添加缓存:

// web/app.phpuse Symfony\Component\HttpFoundation\Request;
// ...$kernel = new AppKernel('prod', false);$kernel->loadClassCache(); 
// add (or uncomment) this new line! / 添加下面新行!
// wrap the default AppKernel with the AppCache one
// 用AppCache打包默认的AppKernel$kernel = new AppCache($kernel); $request = Request::createFromGlobals(); $response = $kernel->handle($request);$response->send(); $kernel->terminate($request, $response);

上面的缓存核心,将立即作为反向代理来运作——从你的程序中缓存响应,然后把它们返回到客户端。

如果你正使用framework.http_method_override选项,来从_method参数中读取HTTP方法,参考上面链接来调整到你需要的程度。

缓存核心有一个特殊的getLog()

캐싱을 켜는 것은 쉽습니다. 전면 컨트롤러 코드만 수정하면 됩니다. app_dev.php에서 다음과 같이 변경하여 dev 환경에 캐시를 추가할 수도 있습니다.
1
위의 캐시 코어는 즉시 다음과 같이 작동합니다. 역방향 프록시 - 애플리케이션의 응답을 캐싱하여 클라이언트에 반환합니다.
framework.http_method_override
옵션을 사용하여 _method 매개변수에서 HTTP 메소드를 읽을 수 있습니다. 위 링크를 참고하여 원하는 대로 조정하세요. 필요.
캐시 코어에는 문자열을 반환하여 정확히 무엇인지 나타내는 특수 getLog() 메서드가 있습니다. 캐시 레이어에서 발생합니다. 개발 환경에서는 이를 사용하여 캐싱 전략을 디버깅하거나 검증할 수 있습니다.
#🎜🎜##🎜🎜##🎜🎜##🎜🎜#
error_log($kernel->getLog());
#🎜🎜##🎜🎜##🎜🎜##🎜🎜 # 으아아아 #🎜🎜##🎜🎜##🎜🎜##🎜🎜##🎜🎜#

AppCache 개체에는 적절한 기본 구성이 있지만 재정의하여 getOptions() 메소드를 설정 일련의 옵션을 사용하면 개체를 미세하게 조정할 수 있습니다. AppCache对象有一个合适的默认配置,但是通过覆写getOptions()方法来设置一组选项,该对象即可被精细调整。

// app/AppCache.phpuse Symfony\Bundle\FrameworkBundle\HttpCache\HttpCache; class AppCache extends HttpCache{
    protected function getOptions()
    {
        return array(
            'debug'                  => false,
            'default_ttl'            => 0,
            'private_headers'        => array('Authorization', 'Cookie'),
            'allow_reload'           => false,
            'allow_revalidate'       => false,
            'stale_while_revalidate' => 2,
            'stale_if_error'         => 60,
        );
    }}


除非在getOptions()方法中进行覆写,否则debub选项将被自动设成“被剥离出来的AppKernel

Cache-Control: private, max-age=0, must-revalidate
 
Cache-Control: max-age=3600, must-revalidate


#🎜🎜#getOptions() 메서드에서 재정의되지 않는 한, 그렇지 않으면 debub 옵션은 "스트립된 AppKernel"의 디버그 값으로 자동 설정됩니다. #🎜🎜##🎜🎜#


주요 옵션 중 일부는 다음과 같습니다.

default_ttldefault_ttl

数值是秒,表达的是当响应中没有提供明确的新鲜度信息时,一个缓存入口被认为是fresh的时长。显式指定Cache-ControlExpires头,可以覆写这个值(默认是0)。


private_headers

一组请求头,在没有“通过Cache-Control指令(默认是AuthorizationCookie)明确声明当前响应是public还是private状态”的响应中,触发“private”Cache-Control行为。


allow_reload

指定客户端是否可以在请求中包容一个Cache-Control的“no-cache”指令来强制重新加载缓存。设为true即可遵守RFC2616(默认是false)。


allow_revalidate

指定客户端是否可以在请求中包容一个来Cache-Control的“max-age=0”来强制重新验证。设为true即可遵守RFC2616(默认是false)。


stale_while_revalidate

指定的默认秒数(以秒为间隔是因为Response的TTL精度是秒),在此期间,尽管缓存在后台对响应正进行重新验证,但它能够立即返回一个不新鲜的响应(默认值是2);本设置可被HTTPCache-Control扩展的stale-while-revalidate覆写(参考RFC 5861)。


stale_if_error

指定的默认秒数(间隔是秒),在此期间,缓存可以对遇到错误的响应提供服务(默认值是60)。本设置可被HTTPCache-Control扩展的stale-if-error覆写(参考RFC 5861)。


如果debug被设为true,Symfony将自动添加一个X-Symfony-Cache

값은 초이며, 응답에 명확한 신선도 정보가 제공되지 않은 경우 캐시 항목이 신선한 것으로 간주되는 시간을 나타냅니다. 이 값은 Cache-Control 또는 Expires 헤더를 명시적으로 지정하여 재정의할 수 있습니다(기본값은 0).

private_headers

<코드를 전달하지 않고 사용할 수 있는 요청 헤더 세트 >Cache- Control 지시문(기본값은 AuthorizationCookie)은 현재 응답이 public인지 private인지 명시적으로 선언합니다. "응답에서 "비공개" 캐시 제어 동작이 트리거됩니다.


allow_reload#🎜🎜##🎜🎜#클라이언트가 요청에 캐시를 포함할 수 있는지 지정하세요. -Control의 "no-cache" 지시문을 사용하여 캐시를 강제로 다시 로드합니다. RFC2616을 준수하려면 true로 설정하세요(기본값은 false). #🎜🎜#
#🎜🎜##🎜🎜#allow_revalidate#🎜🎜##🎜🎜#클라이언트가 요청 캐시에 이를 포함할 수 있는지 지정하세요. -Control의 "max-age=0"을 사용하여 재검증을 강제합니다. RFC2616을 준수하려면 true로 설정합니다(기본값은 false). #🎜🎜#
#🎜🎜##🎜🎜#stale_while_revalidate#🎜🎜##🎜🎜#지정된 기본 시간(초)(초 단위 간격은 응답 TTL 정확도는 초입니다. 캐시가 백그라운드에서 응답을 재검증하더라도 캐시는 즉시 오래된 응답을 반환할 수 있습니다(기본값은 2). 이 설정은 HTTP에서 사용할 수 있습니다. 캐시 제어 확장된 재검증 중 오래된 재정의(RFC 5861 참조). #🎜🎜#
#🎜🎜##🎜🎜#stale_if_error#🎜🎜##🎜🎜#기본 시간(간격은 초)을 지정합니다. 캐시는 오류가 발생한 응답을 제공할 수 있습니다(기본값은 60). 이 설정은 HTTP Cache-Control 확장의 stale-if-error로 재정의될 수 있습니다(RFC 5861 참조). #🎜🎜#
#🎜🎜#debugtrue로 설정된 경우 Symfony는 자동으로 X-Symfony-Cache를 추가합니다. 캐시 적중 및 누락에 대한 유용한 정보가 포함된 응답 헤더입니다. #🎜🎜##🎜🎜##🎜🎜##🎜🎜#웹사이트를 개발하는 동안 또는 웹사이트를 "php 코드 외에는 아무것도" 배포하는 동안 하나의 역방향 프록시에서 다른 역방향 프록시로 전환 #🎜🎜##🎜🎜# 공유 호스팅 설치 과정에서 Symfony의 리버스 프록시는 매우 유용한 도구입니다. 하지만 PHP로 작성되었기 때문에 C로 작성된 프록시만큼 빠르지는 않습니다. 그렇기 때문에 가능하면 프로덕션 서버에서 Vanish 또는 Squid를 사용하는 것이 좋습니다. 좋은 소식은 프로그램에 수정할 코드가 없기 때문에 한 프록시 서버에서 다른 프록시 서버로 전환하는 것이 쉽고 투명하다는 것입니다. 안심하고 Symfony 역방향 프록시를 사용할 수 있으며, 향후 트래픽이 증가하면 언제든지 Varnish로 업그레이드할 수 있습니다. #🎜🎜##🎜🎜##🎜🎜#

Symfony 역방향 프록시의 성능은 프로그램의 복잡성과 무관합니다. 이는 프로그램 커널이 요청을 보내야 할 때만 시작되기 때문입니다.

응답을 HTTP 캐시로 만드세요.

사용 가능한 캐싱 계층을 활용하려면 프로그램이 다음 정보와 통신해야 합니다. 1. 캐시할 수 있는 응답. 2. 캐시가 오래되는 시기와 방법을 결정하는 규칙입니다.

기억하세요. "HTTP"는 클라이언트와 서버가 서로 통신하기 위해 사용하는 언어(간단한 텍스트)일 뿐입니다. HTTP 캐싱은 이 언어의 일부이므로 클라이언트와 서버가 캐시에 대한 정보를 교환할 수 있습니다.

HTTP는 응답에 대해 다음 4개의 캐싱 헤더를 지정합니다.

  • Cache-ControlCache-Control

  • Expires

  • ETag

  • Last-Modified

其中最为重要和功能最强的当属Cache-Control头,它可说是多种缓存信息的集合。

每种头都在HTTP Expiration,Validation和Invalidation小节中进行了详解。

Cache-Control头 

Cache-Control头是特殊的,它包含不止一条,而是很多条和响应的缓存能力相关的信息。每种信息被以英文逗号分隔开来:

// ... use Symfony\Component\HttpFoundation\Response; $response = new Response();
// mark the response as either public or private 标记响应是公有还是私有$response->setPublic();$response->setPrivate();
// set the private or shared max age 设置私有或公有的最大周期$response->setMaxAge(600);$response->setSharedMaxAge(600); 
// set a custom Cache-Control directive 设置一个自定义Cache-Control命令$response->headers->addCacheControlDirective('must-revalidate', true)

Symfony提供了一个关于Cache-Control

Expires

ETag

최종 수정
가장 중요하고 강력한 것은 의심할 여지 없이 Cache-Control<입니다. /code> 헤더는 다양한 캐시 정보의 집합체라고 할 수 있습니다. 🎜🎜🎜🎜각 헤더는 HTTP 만료, 유효성 검사 및 무효화🎜 섹션에 자세히 설명되어 있습니다. 🎜🎜🎜

Cache-Control 헤더 ¶🎜

🎜Cache-Control 헤더는 특별합니다. 이는 단지 하나의 정보가 아니라 응답의 캐싱 기능과 관련된 많은 정보를 포함합니다. 각 정보는 쉼표로 구분됩니다. 🎜
$date = new DateTime();
$date->modify('+600 seconds'); 
$response->setExpires($date);
🎜Symfony는 생성을 보다 쉽게 ​​관리할 수 있도록 Cache-Control 헤더 위에 추상화 계층을 제공합니다. 🎜🎜
Expires: Thu, 01 Mar 2011 16:00:00 GMT
🎜🎜🎜 캐시 헤더를 설정하려는 경우 컨트롤러의 다양한 작업을 보려면 🎜FOSHttpCacheBundle🎜을 살펴보세요. 이는 URL 패턴 일치 및 기타 요청 속성을 기반으로 캐시 헤더를 정의하는 방법을 제공합니다. 🎜🎜🎜

공개 응답 및 비공개 응답

게이트웨이 캐시이든 프록시 캐시이든 캐시 콘텐츠가 더 많은 사용자에 의해 공유되기 때문에 "공유" 공유 캐시로 간주됩니다. "사용자별" 응답이 실수로 공유 캐시에 배치된 경우 나중에 여러 다른 사용자에게 반환될 수 있습니다. 귀하의 계정 정보가 캐시된 다음 계정 페이지를 요청한 모든 후속 사용자에게 전송된다면 어떨지 상상해 보십시오!

이 상황을 처리하려면 각 응답을 공개 또는 비공개로 설정해야 합니다.

public

은 응답이 공개 캐시와 비공개 캐시 모두로 캐시되어야 함을 나타냅니다.


private

은 응답 정보의 전체 또는 일부가 특정 사용자에게만 해당되므로 공개 캐싱에 대한 캐싱이 금지됨을 나타냅니다.


Symfony는 보수적으로 각 응답을 비공개로 설정합니다. 공유 캐시(예: Symfony 역방향 프록시)를 활용하려면 응답을 명시적으로 공개로 설정해야 합니다.

안전한 방법

HTTP 캐싱은 "안전한" HTTP 방법(예: GET 또는 HEAD)에서만 작동합니다. 소위 보안이란 요청에 대한 서비스(예: 로깅, 캐시 정보 처리 등)를 제공할 때 서버의 프로그램 상태를 절대 변경할 수 없음을 의미합니다. 이는 매우 설득력 있고 중요한 두 가지 결론으로 ​​이어집니다.

  • GET 또는 HEAD 요청에 응답하여 프로그램 상태를 변경해서는 안 됩니다. 게이트웨이 캐시를 사용하지 않더라도 프록시 캐싱의 특성상 GET 또는 HEAD 요청이 실제로 서버에 도달할 수도 있고 그렇지 않을 수도 있습니다.

  • PUT, POST 또는 DELETE 메서드를 캐시할 것으로 기대하지 마세요. 이러한 메서드는 애플리케이션 상태가 변경될 때(예: 블로그 게시물 삭제) 사용됩니다. 이를 캐싱하면 특정 요청이 프로그램에 도달하거나 변경되는 것을 방지할 수 있습니다.

캐싱 규칙 및 기본 설정

HTTP1.1에서는 Cache-Control 헤더가 명시적으로 지정되지 않는 한 기본적으로 모든 콘텐츠를 캐시할 수 있습니다. 실제로 대부분의 캐시는 요청에 쿠키가 포함된 경우, 인증 헤더가 포함된 경우, 안전하지 않은 메서드(예: PUT, POST 또는 DELETE)가 사용되는 경우 또는 응답에 리디렉션 상태 코드가 있는 경우 아무 작업도 수행하지 않습니다. Cache-Control头。实践中,多数缓存在请求中包含cookie时、包含authorization头时、使用了一个非安全方法时(比如PUT、POST或DELETE)或当响应有一个重定向状态码时,什么也不做。

当开发者在响应头中什么也没设置时,Symfony依据以下规则,自动设置了有意义的而且是偏保守的Cache-Header头。

  • 如果没有缓存头信息被定义(Cache-ControlExpiresETagLast-Modified),Cache-Control将被设为no-cache,代表响应将不被缓存;

  • 如果Cache-Control是空(但是另外一个缓存头有被设置),其值将被设为private, must-revalidate

    개발자가 응답 헤더에 아무것도 설정하지 않으면 Symfony는 다음 규칙에 따라 의미 있고 보수적인 Cache-Header 헤더를 자동으로 설정합니다. 🎜🎜🎜🎜캐시 헤더가 정의되지 않은 경우(Cache-Control, Expires, ETag 또는 Last-Modified) ), Cache-Controlno-cache로 설정됩니다. 이는 응답이 캐시되지 않음을 의미합니다. 🎜🎜🎜🎜Cache-Control가 비어 있으면(다른 캐시 헤더가 설정됨) 해당 값은 private, must-revalidate로 설정됩니다.
  • 그러나 하나 이상의 Cache-Control 지시문이 설정되어 있고 public 또는 private 지시문이 명시적으로 추가되지 않은 경우 Symfony는 자동으로 code>private 지시문(s-maxage가 설정된 경우 제외) Cache-Control指令被设置,而且没有publicprivate指令被显式添加的话,Symfony会自动添加private指令(除了当s-maxage被设置时)

HTTP Expiration,Validation和Invalidation 

HTTP协议定义了两种缓存模型:

  • 利用expiration model(过期模型),通过包容Cache-Control头和/或Expires头,即可直接指定一个响应应该被认为“新鲜”的时长。缓存能够理解过期时间,不再制造相同请求,直到该缓存版本抵达过期时间,而且变得“不新鲜(stale)”。

  • 当页面是真动态时(展现层经常改变),则validation model(验证模型)的使用就十分有必要。利用这个模型,缓存把响应存储起来,但会在每次请求时向服务器“提问”——是否缓存了的响应仍然有效?程序使用了一个独立的响应识别器(即Etag头)和/或一个时间戳(即Last-Modified

  • HTTP 만료, 유효성 검사 및 무효화

하지만 RFC 2616을 덮어쓰기 위한 🎜HTTP Bis🎜 작업이 진행 중입니다. 이는 HTTP의 새 버전을 설명하지 않지만 원래 HTTP 프로토콜을 정리하는 데 더 가깝습니다. HTTP 프로토콜이 7개 부분으로 나누어져 문서 구성도 개선되었습니다. HTTP 캐싱에 대한 각 부분은 두 개의 별도 장(🎜P4 - 조건부 요청🎜 및 🎜P6 - 캐싱: 브라우저 및 중간 캐시🎜)에서 찾을 수 있습니다. 🎜🎜웹 개발자로서 여러분은 🎜공식 Symfony 팀🎜에서 HTTP 프로토콜에 대해 읽어볼 것을 강력히 권장합니다. HTTP 사양은 매우 명확하고 강력하므로, 만들어진 지 10년이 지난 지금도 HTTP 사양은 매우 귀중합니다. 우리는 이러한 계약의 외양을 무시하지 말 것을 상기시키고 싶습니다. 그 내용은 표지보다 수십만 배 더 아름답습니다. 🎜🎜🎜

Expiration(만료)

expiration 모델은 두 캐싱 모델 중 더 효율적이고 직접적인 모델이므로 최대한 많이 사용해야 합니다. . 만료를 통해 응답이 캐시되면 캐시는 응답을 저장하고 프로그램을 실행하지 않고도 만료 직전에 응답을 반환합니다.

만료 모델은 거의 동일한 두 HTTP 헤더인 Expires 또는 Cache-Control 중 하나를 통해 구현할 수 있습니다. ExpiresCache-Control

使用Expires头控制过期 

根据HTTP specification,“Expires头字段将在response被认为是stale之后给出date/time。”。这里的Expires头可以被设为Response方法:setExpires()。它使用DateTime实例作为参数:

// Sets the number of seconds after which the response
// should no longer be considered fresh// 设置“响应过期”的秒数$response->setMaxAge(600);
 // Same as above but only for shared caches
// 同上,但仅用于共享缓存$response->setSharedMaxAge(600);

该响应的HTTP头信息类似这种:

1

setExpires()方法将自动转换日期为GMT时区,因为这是HTTP specification的要求。

注意,在HTTP 1.1版之前,并不需要原始服务器来发送Date头。因此,缓存(比如浏览器的)就需要本地时钟来评估Expires头,进而令缓存周期的计算因时间倾斜而变得脆弱不堪。另外一个Expires头限制是,正如HTTP协议中所描述的,“HTTP/1.1 不得发送Expires的日期超过一年。”

使用Cache-Control头控制过期 

因为Expires头的限制,多数情况下,你应该使用Cache-Control头来替代。记得,Cache-Control头被用于多种不同的缓存指令。例如,max-ages-maxage。第一个用于全部缓存,而第二个仅在共享缓存时用到。

Cache-Control: max-age=600, s-maxage=600

Cache-Control

Expires 헤더를 사용하여 만료
HTTP 사양에 따라 , " Expires 헤더 필드는 응답이 오래된 것으로 간주된 후 날짜/시간을 제공합니다. 여기에서 Expires 헤더는 Response 메서드(setExpires())로 설정할 수 있습니다. DateTime 인스턴스를 매개변수로 사용합니다:
// Marks the Response stale 标记响应过期$response->expire(); 
// Force the response to return a proper 304 response with no content
// 强制响应返回一个没有内容的恰当的304响应$response->setNotModified();
응답의 HTTP 헤더 정보는 다음과 유사합니다: HTTP 버전 1.1 이전에는 원본 서버가 Date 헤더를 보낼 필요가 없었습니다. 따라서 캐시(예: 브라우저)에는 Expires 헤더를 평가하기 위한 로컬 시계가 필요하므로 캐시 기간 계산이 시간 왜곡에 취약해집니다. 또 다른 Expires 헤더 제한 사항은 HTTP 프로토콜에 설명된 대로 "HTTP/1.1은 1년보다 오래된 날짜의 Expires를 전송해서는 안 됩니다."입니다. 🎜🎜 # Cache-Control 헤더를 사용하여 rrreeeCache-Control 헤더는 일반적으로 다음 형식을 따릅니다(그러나 때로는 다른 지침이 있는 경우도 있음):
// Set cache settings in one call$response->setCache(array(
    'etag'          => $etag,
    'last_modified' => $date,
    'max_age'       => 10,
    's_maxage'      => 10,
    'public'        => true,
    // 'private'    => true,
    ));
setExpires () 메소드는 날짜를 GMT 시간대로 자동 변환합니다. 이는 HTTP 사양의 요구 사항입니다.
<코드> 때문에 만료 제어 Expires 헤더 제한 사항. 대부분의 경우 Cache-Control 헤더를 대신 사용해야 합니다. Cache-Control 헤더는 다양한 캐싱 지시문에 사용된다는 점을 기억하세요. 예를 들어 max-ages-maxage입니다. 첫 번째는 모든 캐시에 사용되는 반면, 두 번째는 캐시를 공유할 때만 사용됩니다.
#🎜🎜##🎜 ㅋㅋㅋ 🎜 🎜 ##🎜🎜#

만료 및 유효성 검사

물론 동일한 응답에 응답할 수 있습니다. >둘 다 사용 검증 및 만료. 만료의 이점이 검증보다 중요하므로 두 가지 장점을 모두 쉽게 누릴 수 있습니다. 즉, 만료와 유효성 검사를 함께 사용하면 캐시에 캐시된 콘텐츠를 제공하도록 지시하는 동시에 특정 간격(만료)으로 역방향을 확인하여 캐시된 콘텐츠가 여전히 유효한지 확인할 수 있습니다. Response同时使用validation和expiration。因为expiration的优势大过validation,你能很容易地从两个世界中好的一面受益。也就是说,同时使用过期和验证,你可以命令缓存来服务于已缓存的内容,同时还能在某些区间(expiration)向后检查以确认缓存内容仍然有效。

你也可以通过annotation来为expiration和validation去定义HTTP缓存头。参考FrameworkExtraBundle文档。

更多Response方法 

Response类提供了很多方法以应对缓存。下面是几个特别有用的:

rrreee

另外,多数与缓存相关的HTTP头可以单独使用setCache()