يمكن لحزمة Laravel هذه تخزين الاستجابة بأكملها مؤقتًا. افتراضيًا، سيتم تخزين جميع طلبات الحصول الناجحة التي تعرض محتوى نصيًا (مثل 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.
// 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 kernel.
// 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
الرجاء مراجعة سجل التغيير لمزيد من المعلومات عما تغير مؤخرًا.
يرجى الاطلاع على المساهمة للحصول على التفاصيل.
إذا وجدت خطأً يتعلق بالأمان، فيرجى إرسال بريد إلكتروني إلى العنوان [email protected] بدلاً من استخدام أداة تعقب المشكلات.
وشكر خاص لشركة Caneco على الشعار
رخصة معهد ماساتشوستس للتكنولوجيا (MIT). يرجى الاطلاع على ملف الترخيص لمزيد من المعلومات.