이 Laravel 패키지는 전체 응답을 캐시할 수 있습니다. 기본적으로 일주일 동안 텍스트 기반 콘텐츠(예: html 및 json)를 반환하는 모든 성공적인 get-request를 캐시합니다. 이는 잠재적으로 응답 속도를 상당히 높일 수 있습니다.
따라서 요청이 패키지에 처음 들어올 때 사용자에게 보내기 전에 응답을 저장합니다. 동일한 요청이 다시 들어오면 전체 애플리케이션을 거치지 않고 저장된 응답으로만 응답합니다.
당신은 시각적 학습자입니까? 그런 다음 laravel-responsecache를 사용하는 방법과 내부적으로 작동하는 방법을 다루는 이 비디오를 시청하세요.
우리는 동급 최고의 오픈 소스 패키지를 만드는 데 많은 리소스를 투자합니다. 유료 제품 중 하나를 구매하여 우리를 지원할 수 있습니다.
귀하가 사용하고 있는 당사 패키지를 언급하면서 귀하의 고향에서 엽서를 보내주셔서 진심으로 감사드립니다. 연락처 페이지에서 주소를 확인하실 수 있습니다. 우리는 수신된 모든 엽서를 가상 엽서 월에 게시합니다.
PHP 7을 사용하는 경우 이 패키지의 v6.x를 설치하세요.
작곡가를 통해 패키지를 설치할 수 있습니다.
composer require spatie/laravel-responsecache
패키지가 자동으로 등록됩니다.
다음을 사용하여 구성 파일을 게시할 수 있습니다.
php artisan vendor:publish --tag= " responsecache-config "
게시된 구성 파일의 내용은 다음과 같습니다.
// config / responsecache . php
return [
/ *
* Determine if the response cache middleware should be enabled .
* /
' enabled ' => env ( ' RESPONSE_CACHE_ENABLED ' , true ),
/ *
* The given class will determinate if a request should be cached . The
* default class will cache all successful GET - requests .
*
* You can provide your own class given that it implements the
* CacheProfile interface .
* /
' cache_profile ' => Spatie ResponseCache CacheProfiles CacheAllSuccessfulGetRequests::class,
/ *
* Optionally , you can specify a header that will force a cache bypass .
* This can be useful to monitor the performance of your application .
* /
' cache_bypass_header ' => [
' name ' => env ( ' CACHE_BYPASS_HEADER_NAME ' , null ),
' value ' => env ( ' CACHE_BYPASS_HEADER_VALUE ' , null ),
],
/ *
* When using the default CacheRequestFilter this setting controls the
* default number of seconds responses must be cached .
* /
' cache_lifetime_in_seconds ' => env ( ' RESPONSE_CACHE_LIFETIME ' , 60 * 60 * 24 * 7 ),
/ *
* This setting determines if a http header named with the cache time
* should be added to a cached response . This can be handy when
* debugging .
* /
' add_cache_time_header ' => env ( ' APP_DEBUG ' , true ),
/ *
* This setting determines the name of the http header that contains
* the time at which the response was cached
* /
' cache_time_header_name ' => env ( ' RESPONSE_CACHE_HEADER_NAME ' , ' laravel-responsecache ' ),
/ *
* This setting determines if a http header named with the cache age
* should be added to a cached response . This can be handy when
* debugging .
* ONLY works when "add_cache_time_header" is also active !
* /
' add_cache_age_header ' => env ( ' RESPONSE_CACHE_AGE_HEADER ' , false ),
/ *
* This setting determines the name of the http header that contains
* the age of cache
* /
' cache_age_header_name ' => env ( ' RESPONSE_CACHE_AGE_HEADER_NAME ' , ' laravel-responsecache-age ' ),
/ *
* Here you may define the cache store that should be used to store
* requests . This can be the name of any store that is
* configured in app / config / cache . php
* /
' cache_store ' => env ( ' RESPONSE_CACHE_DRIVER ' , ' file ' ),
/ *
* Here you may define replacers that dynamically replace content from the response .
* Each replacer must implement the Replacer interface .
* /
' replacers ' => [
Spatie ResponseCache Replacers CsrfTokenReplacer::class,
],
/ *
* If the cache driver you configured supports tags , you may specify a tag name
* here . All responses will be tagged . When clearing the responsecache only
* items with that tag will be flushed .
*
* You may use a string or an array here .
* /
' cache_tag ' => '' ,
/ *
* This class is responsible for generating a hash for a request . This hash
* is used to look up an cached response .
* /
' hasher ' => Spatie ResponseCache Hasher DefaultHasher::class,
/ *
* This class is responsible for serializing responses .
* /
' serializer ' => Spatie ResponseCache Serializers DefaultSerializer::class,
];
마지막으로 제공된 미들웨어인 SpatieResponseCacheMiddlewaresCacheResponse::class
및 SpatieResponseCacheMiddlewaresDoNotCacheResponse
설치해야 합니다.
Laravel 11.x 이상의 경우:
부트스트랩 앱에 미들웨어 정의를 추가합니다.
// bootstrap / app . php
-> withMiddleware ( function ( Middleware $ middleware ) {
. . .
$ middleware -> web (append: [
...
Spatie ResponseCache Middlewares CacheResponse::class,
]);
. . .
$ middleware -> alias ([
...
' doNotCacheResponse ' => Spatie ResponseCache Middlewares DoNotCacheResponse::class,
]);
})
Laravel 10.x 이하의 경우:
http 커널에 미들웨어 정의를 추가합니다.
// app / Http / Kernel . php
. . .
protected $ middlewareGroups = [
' web ' => [
...
Spatie ResponseCache Middlewares CacheResponse::class,
],
...
protected $ middlewareAliases = [
...
' doNotCacheResponse ' => Spatie ResponseCache Middlewares DoNotCacheResponse::class,
];
기본적으로 패키지는 일주일 동안 성공한 모든 GET
요청을 캐시합니다. 로그인한 사용자는 각자 자신만의 별도 캐시를 갖게 됩니다. 이 동작이 필요하다면 완료된 것입니다. ResponseCacheServiceProvider
를 설치하는 것으로 충분합니다.
다음을 사용하여 전체 캐시를 지울 수 있습니다.
ResponseCache:: clear ();
이렇게 하면 구성 파일에 지정된 캐시 저장소의 모든 내용이 지워집니다.
다음 장인 명령을 실행하여 동일한 작업을 수행할 수 있습니다.
php artisan responsecache:clear
모델이 저장되거나 삭제될 때마다 모델 이벤트를 활용하여 캐시를 지울 수 있습니다. 여기에 예가 있습니다.
namespace App Traits ;
use Spatie ResponseCache Facades ResponseCache ;
trait ClearsResponseCache
{
public static function bootClearsResponseCache ()
{
self :: created ( function () {
ResponseCache:: clear ();
});
self :: updated ( function () {
ResponseCache:: clear ();
});
self :: deleted ( function () {
ResponseCache:: clear ();
});
}
}
다음을 사용하여 특정 URI를 잊을 수 있습니다.
// Forget one
ResponseCache:: forget ( ' /some-uri ' );
// Forget several
ResponseCache:: forget ([ ' /some-uri ' , ' /other-uri ' ]);
// Equivalent to the example above
ResponseCache:: forget ( ' /some-uri ' , ' /other-uri ' );
ResponseCache::forget
메소드는 캐시 프로필에서 cacheNameSuffix
사용하지 않는 경우에만 작동합니다. ResponseCache::selectCachedItems
사용하여 cacheNameSuffix
를 처리합니다.
ResponseCache::selectCachedItems()
사용하여 어떤 캐시된 항목을 잊어야 하는지 지정할 수 있습니다.
// forgetting all PUT responses of / some - uri
ResponseCache:: selectCachedItems ()-> withPutMethod ()-> forUrls ( ' /some-uri ' )-> forget ();
// forgetting all PUT responses of multiple endpoints
ResponseCache:: selectCachedItems ()-> withPutMethod ()-> forUrls ([ ' /some-uri ' , ' /other-uri ' ])-> forget ();
// this is equivalent to the example above
ResponseCache:: selectCachedItems ()-> withPutMethod ()-> forUrls ( ' /some-uri ' , ' /other-uri ' )-> forget ();
// forget / some - uri cached with "100" suffix ( by default suffix is user - > id or "" )
ResponseCache:: selectCachedItems ()-> usingSuffix ( ' 100 ' )-> forUrls ( ' /some-uri ' )-> forget ();
// all options combined
ResponseCache:: selectCachedItems ()
-> withPutMethod ()
-> withHeaders ([ ' foo ' => ' bar ' ])
-> withCookies ([ ' cookie1 ' => ' value ' ])
-> withParameters ([ ' param1 ' => ' value ' ])
-> withRemoteAddress ( ' 127.0.0.1 ' )
-> usingSuffix ( ' 100 ' )
-> usingTags ( ' tag1 ' , ' tag2 ' )
-> forUrls ( ' /some-uri ' , ' /other-uri ' )
-> forget ();
cacheNameSuffix
는 캐시 프로필에 따라 다르며, 기본적으로 사용자 ID이거나 인증되지 않은 경우 빈 문자열입니다.
doNotCacheResponse
미들웨어를 사용하면 요청을 무시할 수 있습니다. 이 미들웨어는 경로와 컨트롤러에 할당될 수 있습니다.
미들웨어를 사용하면 경로가 캐시되지 않을 수 있습니다.
// app / Http / routes . php
Route:: get ( ' /auth/logout ' , [ ' middleware ' => ' doNotCacheResponse ' , ' uses ' => ' AuthController@getLogout ' ]);
또는 컨트롤러에 미들웨어를 추가할 수 있습니다.
class UserController extends Controller
{
public function __construct ()
{
$ this -> middleware ( ' doNotCacheResponse ' , [ ' only ' => [ ' fooAction ' , ' barAction ' ]]);
}
}
의도적으로 안전하게 캐시를 우회하여 항상 새로운 응답을 받을 수 있습니다. 이는 일부 엔드포인트를 프로파일링하려는 경우나 응답을 디버그해야 하는 경우에 유용할 수 있습니다. 어떤 경우든 CACHE_BYPASS_HEADER_NAME
및 CACHE_BYPASS_HEADER_VALUE
환경 변수를 채운 다음 요청을 수행할 때 해당 사용자 정의 헤더를 사용하기만 하면 됩니다.
캐시해야 하는 요청과 그 기간을 결정하기 위해 캐시 프로필 클래스가 사용됩니다. 이러한 질문을 처리하는 기본 클래스는 SpatieResponseCacheCacheProfilesCacheAllSuccessfulGetRequests
입니다.
SpatieResponseCacheCacheProfilesCacheProfile
인터페이스를 구현하여 고유한 캐시 프로필 클래스를 만들 수 있습니다. 인터페이스를 살펴보겠습니다.
interface CacheProfile
{
/ *
* Determine if the response cache middleware should be enabled .
* /
public function enabled ( Request $ request ): bool ;
/ *
* Determine if the given request should be cached .
* /
public function shouldCacheRequest ( Request $ request ): bool ;
/ *
* Determine if the given response should be cached .
* /
public function shouldCacheResponse ( Response $ response ): bool ;
/ *
* Return the time when the cache must be invalidated .
* /
public function cacheRequestUntil ( Request $ request ): DateTime ;
/ * *
* Return a string to differentiate this request from others .
*
* For example : if you want a different cache per user you could return the id of
* the logged in user .
*
* @ param Illuminate Http Request $ request
*
* @ return mixed
* /
public function useCacheNameSuffix ( Request $ request );
}
cacheResponse
미들웨어를 전역적으로 등록하는 대신 경로 미들웨어로 등록할 수도 있습니다.
protected $ middlewareAliases = [
...
' cacheResponse ' => Spatie ResponseCache Middlewares CacheResponse::class,
];
경로 미들웨어를 사용할 때 이러한 경로를 캐시해야 하는 시간(초)을 지정할 수 있습니다.
// cache this route for 5 minutes
Route:: get ( ' /my-special-snowflake ' , ' SnowflakeController@index ' )-> middleware ( ' cacheResponse:300 ' );
// cache all these routes for 10 minutes
Route:: group ( function () {
Route:: get ( ' /another-special-snowflake ' , ' AnotherSnowflakeController@index ' );
Route:: get ( ' /yet-another-special-snowflake ' , ' YetAnotherSnowflakeController@index ' );
})-> middleware ( ' cacheResponse:600 ' );
구성한 캐시 드라이버가 태그를 지원하는 경우 미들웨어 적용 시 태그 목록을 지정할 수 있습니다.
// add a "foo" tag to this route with a 300 second lifetime
Route:: get ( ' /test1 ' , ' SnowflakeController@index ' )-> middleware ( ' cacheResponse:300,foo ' );
// add a "bar" tag to this route
Route:: get ( ' /test2 ' , ' SnowflakeController@index ' )-> middleware ( ' cacheResponse:bar ' );
// add both "foo" and "bar" tags to these routes
Route:: group ( function () {
Route:: get ( ' /test3 ' , ' AnotherSnowflakeController@index ' );
Route:: get ( ' /test4 ' , ' YetAnotherSnowflakeController@index ' );
})-> middleware ( ' cacheResponse:foo,bar ' );
태그 또는 태그 목록이 할당된 응답을 지울 수 있습니다. 예를 들어, 이 명령문은 위의 '/test3'
및 '/test4'
경로를 제거합니다.
ResponseCache:: clear ([ ' foo ' , ' bar ' ]);
대조적으로, 이 명령문은 '/test2'
경로만 제거합니다:
ResponseCache:: clear ([ ' bar ' ]);
이는 Laravel에 내장된 캐시 태그 기능을 사용하므로 일반적인 방법으로 경로를 지울 수도 있습니다.
Cache:: tags ( ' special ' )-> flush ();
애플리케이션에서 응답 캐싱을 모니터링하고 디버그하는 데 사용할 수 있는 여러 이벤트가 있습니다.
SpatieResponseCacheEventsResponseCacheHit
이 이벤트는 요청이 ResponseCache
미들웨어를 통과하고 캐시된 응답이 발견되어 반환되면 시작됩니다.
SpatieResponseCacheEventsCacheMissed
이 이벤트는 요청이 ResponseCache
미들웨어를 통과했지만 캐시된 응답이 없거나 반환되지 않은 경우 발생합니다.
SpatieResponseCacheEventsClearingResponseCache
SpatieResponseCacheEventsClearedResponseCache
이러한 이벤트는 responsecache:clear
가 시작되고 완료될 때 각각 시작됩니다.
캐시된 콘텐츠를 동적 콘텐츠로 바꾸려면 대체 프로그램을 생성하면 됩니다. 기본적으로 구성 파일에 CsrfTokenReplacer
를 추가합니다.
SpatieResponseCacheReplacersReplacer
인터페이스를 구현하여 자신만의 대체자를 만들 수 있습니다. 인터페이스를 살펴보겠습니다.
interface Replacer
{
/ *
* Prepare the initial response before it gets cached .
*
* For example : replace a generated csrf_token by '<csrf-token-here>' that you can
* replace with its dynamic counterpart when the cached response is returned .
* /
public function prepareResponseToCache ( Response $ response ): void ;
/ *
* Replace any data you want in the cached response before it gets
* sent to the browser .
*
* For example : replace '<csrf-token-here>' by a call to csrf_token ()
* /
public function replaceInCachedResponse ( Response $ response ): void ;
}
그 후에 responsecache.php
구성 파일에서 대체자를 정의할 수 있습니다:
/*
* Here you may define replacers that dynamically replace content from the response.
* Each replacer must implement the Replacer interface.
*/
'replacers' => [
SpatieResponseCacheReplacersCsrfTokenReplacer::class,
],
직렬 변환기는 캐시에 저장할 수 있도록 응답을 직렬화하는 일을 담당합니다. 또한 캐시에서 응답을 다시 작성하는 일도 담당합니다.
기본 직렬 변환기 SpatieResponseCacheSerializerDefaultSerializer
대부분의 경우 작동합니다.
특별한 직렬화가 필요한 경우 구성 파일의 serializer
키에 사용자 정의 직렬 변환기를 지정할 수 있습니다. SpatieResponseCacheSerializersSerializer
구현하는 모든 클래스를 사용할 수 있습니다. 해당 인터페이스는 다음과 같습니다.
namespace Spatie ResponseCache Serializers ;
use Symfony Component HttpFoundation Response ;
interface Serializer
{
public function serialize ( Response $ response ): string ;
public function unserialize ( string $ serializedResponse ): Response ;
}
다음을 사용하여 테스트를 실행할 수 있습니다.
composer test
최근 변경된 사항에 대한 자세한 내용은 CHANGELOG를 참조하세요.
자세한 내용은 CONTRIBUTING을 참조하세요.
보안 관련 버그를 발견한 경우 이슈 트래커를 사용하는 대신 [email protected]로 메일을 보내주세요.
그리고 로고를 주신 Caneco에게 특별한 감사를 드립니다.
MIT 라이센스(MIT). 자세한 내용은 라이센스 파일을 참조하십시오.