mr.*_*ris 3 php .htaccess caching laravel artisan
我想在Laravel项目中缓存一条路由,并每5分钟清除一次。
我搜索了一堆文章,但仅找到artisan route:cache命令,我不知道是否可以配置缓存时间。
所以,这是我的路线routes/web.php:
$router->group(['middleware' => ['api','cors']], function () use ($router) {
$router->get('game', ['uses' => 'GameController@checkGameStatus']);
$router->get('promo', ['uses' => 'PromoController@sendPromoCode']);
$router->get('get_leaders', ['uses' => 'GameController@getLeaders']); // <-- cache this for 5m
});
Run Code Online (Sandbox Code Playgroud)
每次用户加载评分页面时,该getLeaders()功能都会启动数据库请求以获取并计算所有用户结果。因此,我想减少数据库负载,并使其每5分钟计算一次所有结果。其余时间get_leaders路由应仅发送回缓存的json输出。
如何设置这样的配置?是否可以只使用Laravel(工匠)来做,还是应该更改.htaccess文件(我正在使用apache)?
实际上,这是一个非常简单的解决问题的方法。在您的函数中getLeaders(),您需要修改代码:
public function getLeaders(){
$leadersCache = Cache::get("leaders", null);
if($leadersCache){
return response()->json(["leaders", $leadersCache], 200);
}
$leaders = Leader::where(...)->get();
Cache::put("leaders", $leaders, 5);
return response(["leaders", $leaders], 200);
}
Run Code Online (Sandbox Code Playgroud)
因此,首先要做的是检查"leaders"缓存中是否存在。如果这样做,它将简单地返回该值。如果没有(第一次调用此路由时就是这种情况),它将进行计算,并使用Cache::put()将其存储在缓存中,然后返回。在接下来的5分钟内,只要点击此路由,它将返回缓存的结果,直到再次开始该过程为止。
请注意,上面的是伪代码,未显示您的Controller,但是该方法可以轻松地适用于现有代码。另外,您可能需要use Cache;在控制器顶部添加,或Cache通过\Cache::{method}
有关缓存的所有信息都可以在文档中找到:https : //laravel.com/docs/5.7/cache
要添加到@TimLewis的答案中,如果您使用的是laravel 5.8或更高版本,则Cache :: remember函数可以大大简化控制器代码
public function getLeaders(){
$leaders = Cache::remember('leaders', 300, function () {
return Leader::where(...)->get();
});
return response()->json(['leaders' => $leaders]);
}
Run Code Online (Sandbox Code Playgroud)
该Cache::remember函数负责整个缓存工作流程,它首先检查领导者对象的缓存并返回(如果存在)。如果不是,它将在闭包内部运行代码,并将结果存储在缓存中的第一个参数指定的键下,并保留第二个参数指定的秒数。因此,在这种情况下,它将结果存储在键“ leaders”下的时间为300秒(5分钟)。
| 归档时间: |
|
| 查看次数: |
41 次 |
| 最近记录: |