您现在的位置是:网站首页 > PHP>缓存完整的响应加速应用——spatie/laravel-responsecache
缓存完整的响应加速应用——spatie/laravel-responsecache
- PHP
- 2019-01-09
- 483人已阅读
响应速度对于任何一个项目都是十分重要的,缓存是很重要的一种手段,当访问量大时,合理的增加缓存,能有效的缓解服务器压力。
之前有一篇技术分享介绍的扩展包 watson/rememberable, 可以很方便的实现数据查询的缓存,今天要分享的扩展包 spatie/laravel-responsecache 则是通过缓存完整的响应来加速应用,下面是使用的方式。
1、安装
$ composer require spatie/laravel-responsecache
发布配置文件
$ php artisan vendor:publish --provider="Spatie\ResponseCache\ResponseCacheServiceProvider"
配置文件参数说明:
- enabled —— 是否开启缓存;
- cache_profile —— 定义什么样的请求需要被缓存,可自定义;
- cache_lifetime_in_minutes —— 默认的缓存时间,单位分钟,默认为 7 天;
- add_cache_time_header —— 是否在响应中添加 Laravel-responsecache 头,用于说明缓存添加时间,默认会在 debug 模式添加;
- cache_store —— 定义缓存存放的驱动,默认是 file, 推荐 redis。
- cache_tag —— 当使用了 redis 这样的缓存驱动是,可以增加缓存标签,使用 responsecache:clear 命令只会清除对应标签的缓存。
修改配置中的驱动默认为 redis,并配置 cache_tag 为 itxwzj-response :
config/responsecache.php
.
.
.
'cache_store' => env('RESPONSE_CACHE_DRIVER', 'redis'),
'cache_tag' => 'itxwzj-response',
.
.
.
扩展包缓存的逻辑都会通过 \Spatie\ResponseCache\Middlewares\CacheResponse 这个中间件来完成的,逻辑大致如下图片:
最后是否需要缓存检测如下内容:
- 不缓存 ajax 请求;
- 不缓存 testing 环境(APP_ENV=testing)或者 console 模式下的请求;
- 只缓存 GET 请求;
- 只缓存成功的响应或者状态码在 300 至 400 之间跳转的响应。
一次请求以及对应的响应满足了上面的条件,便会被缓存,这样下次请求同样的请求,中间件就直接返回响应了。这些逻辑是通过配置中 cache_profile 配置的类来完成的,如果默认的逻辑不满足你的需求,可以自己完成一个类,替换 cache_profile 配置,这个类只需要实现 Spatie\ResponseCache\CacheProfiles\CacheProfile 接口中的方法即可。
2、使用
全局使用
第一种使用方式是全局使用,将中间件定义在 web 这个中间件组中,扩展包也提供了一个 doNotCacheResponse 中间件,用于说明哪些路由不需要缓存。
修改 app/Http/Kernel.php
.
.
.
protected $middlewareGroups = [
'web' => [
.
.
.
// 缓存响应
\Spatie\ResponseCache\Middlewares\CacheResponse::class,
],
.
.
.
protected $routeMiddleware = [
.
.
.
// 不缓存的响应
'doNotCacheResponse' => \Spatie\ResponseCache\Middlewares\DoNotCacheResponse::class,
];
.
.
.
在不使用 doNotCacheResponse 时默认会缓存所有的 GET 请求,访问一次就会把 GET 请求缓存下来。
清除指定页面的缓存
如果后台把数据修改或者删除时,我们需要清除缓存,可以直接通过 php artisan responsecache:clear 或者直接调用 ResponseCache::clear(); 可以直接清除所有页面的完整缓存(当设置了 cache_tag 时),如果需要只清除指定页面缓存,可以使用下面方法:
ResponseCache::forget(route('root'));
指定路由不使用缓存
Route::get('/', 'IndexController@index')->name('root')->middleware('doNotCacheResponse');
第二种方法,在项目中其实我们大多数情况下是只希望指定的一些页面进行缓存,像后台的请求基本上不用缓存,这时我们可以这样操作,取出全局缓存 \Spatie\ResponseCache\Middlewares\CacheResponse::class, ,添加如下代码:
app/Http/Kernel.php
.
.
.
protected $routeMiddleware = [
.
.
.
// 需要缓存的响应
'cacheResponse' => \Spatie\ResponseCache\Middlewares\CacheResponse::class,
];
.
.
.
这时只针对需要缓存的路由使用 cacheResponse 中间件即可,例如:
routes/web.php
.
.
.
// 前台主页
Route::get('/', 'IndexController@index')->name('home')->middleware('cacheResponse:60');
.
.
.
这时候在首次访问首页就会对首页进行缓存,第二个参数是缓存多长时间,单位是分钟,这里我缓存 60 分钟。
总结
扩展包提供了缓存整个响应的功能,我们需要根据具体的业务场景看什么样的页面可以做这样的缓存:
- 内容经常变动斩页面不要这样缓存;
- csrf token 也会被缓存,再次提交表单时会验证失败,所以有表单的页面不要设置这样的缓存
- 必要的时候可以通过 ResponseCache::clear() 清除全部的缓存
- 可以通过 ResponseCache::forget() ,清除某个单独页面的缓存,但是只能针对未登录页面或者具体用户进行清除;
- 可以通过自定义 cache_profile 类来改变缓存的逻辑来满足特殊的业务场景。
最新评论
站长大王来回复你了,长点心吧!