Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 拉威尔:如何缓存路由5分钟?_Php_Laravel_.htaccess_Caching_Laravel Artisan - Fatal编程技术网

Php 拉威尔:如何缓存路由5分钟?

Php 拉威尔:如何缓存路由5分钟?,php,laravel,.htaccess,caching,laravel-artisan,Php,Laravel,.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@checkG

我想在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
});
$router->group(['middleware'=>['api','cors']],函数()使用($router){
$router->get('game',['uses'=>'GameController@checkGameStatus']);
$router->get('promo',['uses'=>'PromoController@sendPromoCode']);

$router->get('get_leaders',['uses'=>'GameController@getLeaders“]);//这实际上是一个很容易解决的问题。在函数
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);
}
因此,这做的是,首先检查缓存中是否存在
“leaders”
。如果存在,它将简单地返回该值。如果不存在(第一次调用此路由时就是这种情况),则它将执行计算,并使用
缓存::put()
,将其存储在缓存中,然后返回。在接下来的5分钟内,只要点击此路由,它就会返回缓存的结果,直到该过程再次启动

注意,上面的代码是伪代码,因为没有显示您的控制器,但是这种方法可以很容易地适应现有代码。此外,您可能需要在控制器顶部包含
use Cache;
,或者通过
\Cache::{method}
引用
Cache


有关缓存的所有信息都可以在文档中找到:

要添加到@Timleis的答案中,如果您使用的是laravel 5.8或更高版本,那么cache::memory函数可以大大简化控制器代码

公共函数getLeaders(){ $leaders=Cache::记住('leaders',300,函数(){ 返回引线::其中(…)->get(); }); 返回响应()->json(['leaders'=>$leaders]); }

Cache::rememble
函数负责整个缓存工作流,它首先检查leaders对象的缓存,并返回该对象是否存在。如果不存在,它将在闭包内运行代码,并将结果存储在缓存中第一个参数中指定的键下,保存时间为第二个参数中指定的秒数o在这种情况下,它会将结果缓存在键“leaders”下300秒(5分钟).

路由缓存不是您在这里要寻找的,路由缓存只是缓存传入请求到控制器操作的转换,而不是来自控制器的实际数据或响应。要实现这种缓存,请使用控制器操作中的普通缓存外观,您可能不需要路由缓存,但需要对象/结果缓存nna对此稍作修改,因为您可以使用cache::memory函数来简化此操作lot@AlecJoy感谢您的编辑建议,但这与我编写的代码有很大的偏差。非常欢迎您将其作为自己的答案编写(我不知道
记住
方法存在,但绝对是一个不错的方法)听起来很公平,我会这么做的谢谢!Laravel太棒了:)是的,这绝对是一个更简洁的答案;将检查逻辑引入包装器函数也很酷,我们必须使用这个:)唯一需要注意的是,
300
是缓存时间吗?答案是“5分钟”,所以我认为这有点长。在5.8和更新版本中,缓存facade被更改为PSR-7兼容,现在需要几秒而不是几分钟。所以在这种情况下300秒==5分钟啊,明白了。这是有道理的!抱歉,但我的版本低于5.8 hehe。无论如何,谢谢你的回答!