Этот пакет Laravel может кэшировать весь ответ. По умолчанию он кэширует все успешные get-запросы, возвращающие текстовый контент (например, html и json), в течение недели. Потенциально это может значительно ускорить ответ.
Таким образом, при первом поступлении запроса в пакете ответ будет сохранен перед отправкой его пользователям. Когда тот же запрос поступает снова, мы не просматриваем все приложение, а просто отвечаем сохраненным ответом.
Вы визуал? Тогда посмотрите это видео, в котором рассказывается, как использовать laravel-responsecache и как он работает «под капотом».
Мы вкладываем много ресурсов в создание лучших в своем классе пакетов с открытым исходным кодом. Вы можете поддержать нас, купив один из наших платных продуктов.
Мы очень признательны вам за отправку нам открытки из вашего родного города с указанием того, какой из наших пакетов вы используете. Наш адрес вы найдете на странице контактов. Все полученные открытки мы публикуем на нашей виртуальной стене открыток.
Если вы используете PHP 7, установите версию 6.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
зависит от вашего профиля кэша, по умолчанию это идентификатор пользователя или пустая строка, если он не прошел проверку подлинности.
Запросы можно игнорировать с помощью промежуточного программного обеспечения 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). Пожалуйста, смотрите файл лицензии для получения дополнительной информации.