แพ็คเกจ Laravel นี้สามารถแคชการตอบสนองทั้งหมดได้ ตามค่าเริ่มต้น ระบบจะแคชคำขอรับที่สำเร็จทั้งหมดที่ส่งคืนเนื้อหาที่เป็นข้อความ (เช่น html และ json) เป็นเวลาหนึ่งสัปดาห์ สิ่งนี้อาจช่วยเร่งการตอบสนองได้ค่อนข้างมาก
ดังนั้นครั้งแรกที่มีการร้องขอเข้ามาในแพ็คเกจจะบันทึกการตอบกลับก่อนที่จะส่งไปยังผู้ใช้ เมื่อมีคำขอเดิมเข้ามาอีกครั้ง เราจะไม่ผ่านแอปพลิเคชันทั้งหมด แต่เพียงตอบกลับด้วยการตอบกลับที่บันทึกไว้
คุณเป็นผู้เรียนรู้จากการมองเห็นหรือไม่? จากนั้นดูวิดีโอนี้ซึ่งครอบคลุมถึงวิธีที่คุณสามารถใช้ 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 สำหรับข้อมูลเพิ่มเติมว่ามีอะไรเปลี่ยนแปลงเมื่อเร็วๆ นี้
โปรดดูการมีส่วนร่วมเพื่อดูรายละเอียด
หากคุณพบข้อบกพร่องเกี่ยวกับการรักษาความปลอดภัย โปรดส่งอีเมลไปที่ [email protected] แทนการใช้ตัวติดตามปัญหา
และขอขอบคุณ Caneco เป็นพิเศษสำหรับโลโก้
ใบอนุญาตเอ็มไอที (MIT) โปรดดูไฟล์ใบอนุญาตสำหรับข้อมูลเพิ่มเติม