この Laravel パッケージは、応答全体をキャッシュできます。デフォルトでは、テキストベースのコンテンツ (html や json など) を返す、成功したすべての get リクエストが 1 週間キャッシュされます。これにより、応答が大幅に高速化される可能性があります。
したがって、パッケージに初めてリクエストが入ったとき、ユーザーに送信する前にレスポンスが保存されます。同じリクエストが再び届いた場合、アプリケーション全体を処理するのではなく、保存されたレスポンスで応答するだけです。
あなたは視覚的に学習する人ですか?次に、laravel-responsecache の使用方法と内部でどのように機能するかを説明したこのビデオをご覧ください。
私たちはクラス最高のオープンソース パッケージの作成に多くのリソースを投資しています。有料製品のいずれかを購入することで、私たちをサポートできます。
当社のどのパッケージを使用しているかについて、故郷から葉書を送っていただき、誠にありがとうございます。当社の住所は、お問い合わせページに記載されています。受け取ったすべてのポストカードをバーチャル ポストカード ウォールに公開します。
PHP 7 を使用している場合は、このパッケージの v6.x をインストールします。
パッケージは、composer 経由でインストールできます。
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
リクエストを 1 週間キャッシュします。ログインしているユーザーはそれぞれ独自の個別のキャッシュを持ちます。この動作が必要な場合は、これで完了です。ResponseCacheServiceProvider 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
を使用していない場合にのみ機能します。cacheNameSuffix cacheNameSuffix
処理するには、 ResponseCache::selectCachedItems
を使用します。
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 を参照してください。
詳細については、「貢献」を参照してください。
セキュリティに関するバグを見つけた場合は、問題トラッカーを使用する代わりに [email protected] にメールを送信してください。
そして、ロゴを提供してくれたCanecoに特別な感謝を捧げます
MIT ライセンス (MIT)。詳細については、ライセンス ファイルを参照してください。