laravel使用cache缓存或redis在ubuntu服务器中不生效问题(暂未找到问题所在)
故事:发送短信验证码时,1个客户收到了多条验证码。于是想在这里根据手机号加上缓存时间来阻止同一时间内发送多条验证码。(比如,同一手机号在30秒内只能发送1条短信)
//测试服务器当缓存值大于等于5时,会再次执行这里 //return会有这个现象,exit不会。 //猜想:return将值返回给response类,response类再次调用当前方法testcache(), //这里由于刚才的第1次cache->set,所以这时又进入到<5的判断中,return->fail //但win本地未出现这种情况
开始
class TestController extends Controller
{
function testcache(Request $request)
{
$post['mobile'] = '153****9776';
$cache_key = 'SmsController:getCodeByMobile:'.$post['mobile'];
// $send_time = Cache::get($cache_key);
$send_time = redis()->get($cache_key);
if(!$send_time) $send_time = 0;
$time = time();
if($time-$send_time < 5)
{
Log::error($cache_key.'小于5');
//测试服务器当缓存值大于等于5时,会再次执行这里
//return会有这个现象,exit不会。
//猜想:return将值返回给response类,response类再次调用当前方法testcache(),
//这里由于刚才的第1次cache->set,所以这时又进入到<5的判断中,return->fail
//但win本地未出现这种情况
return $this->fail('请勿频繁点击'.$time.'-'.$send_time.'='.($time-$send_time), 400);
}else{
Log::error($cache_key.'>5');
// Cache::put($cache_key, $time, $seconds = 1000);
redis()->set($cache_key, $time, 5);
if($request->get('exit'))
{
exit('this is exit;');
}
return 666;
}
}
}
找到原因了:SwitchDatabase
$response = $next($request);
return $response;
执行了上面2个步骤。所以有这个问题。
class SwitchDatabase
{
public function handle(Request $request, Closure $next)
{
$database = $this->getDatabase($request->getHost());
try {
DB::beginTransaction();
DB::purge('mysql');
$res = config(['database.connections.mysql.database' => $database]);
DB::reconnect('mysql');
// 在事务中执行操作
$response = $next($request);
DB::transaction(function () use ($request, $next, &$response) {
$response = $next($request);//这里导致的,因为下面又执行了。return $response
});
return $response;
} catch (\Throwable $e) { // 处理异常
DB::rollBack(); // 回滚事务
throw new \Exception($e->getMessage());
}
}
//获取数据库
function getDatabase(String $host)
{
$database = Cache::get($host);
if (!$database) {
$database = Database::where("host",$host)->value("database");
Cache::set($host, $database, 60*24); //缓存一天
}
return $database;
}
}
结束
文章描述了一个在Laravel应用中遇到的问题,即在Ubuntu服务器上使用cache或redis进行缓存时,短信验证码发送限制功能不工作。原因是SwitchDatabase中间件中的事务处理导致了代码重复执行。在本地Windows环境未出现此问题。解决方案是调整中间件中事务的处理方式,避免代码被多次执行。
2013

被折叠的 条评论
为什么被折叠?



