Redis 异常情况
阐述一下我的问题
现在我在一个控制器里调用Redis出现了奇怪的现象,在login方法里调用redis例如get\set方法都是没问题的,在redis-cli终端里也能看见键和值。
但是我在logout里却看不到任何值,仿佛我调用了一个其他的redis服务,但是我用ps -aux| grep ‘redis’的时候却只看到一个,然后我干掉了这个pid,这个时候login方法访问不了了,报错,显示连接不上server服务。
但是这个logout方法通过中间件调用redis却能访问正常,感觉像见鬼了一样。
我的路由是这样的
Route::group(['middleware'=>'checktoken'],function (){
Route::post('/logout','\App\Http\Controllers\Api\DriversController@logout');
});
Route::post('/login','\App\Http\Controllers\Api\DriversController@login');
我的中间件
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$token = $request->header('token');
$uid = $request->header('uid');
$cache = Redis::get('D:U:'.$uid);
if(!$cache){
return \response('请重新登陆',301);
}
if($token != $cache){
return \response('请重新登陆',301);
}
JWT::$leeway = 60;
$alg =
[
"typ" => "JWT", //声明类型为jwt
"alg" => "HS256" //声明签名算法为SHA256
];
$key = 'FrNc-TAbK29_HwbQK_tM';
try{
JWT::decode($token,$key,$alg);
}
catch (\Exception $e) {
return response()->json('token无效:' . $e);
}
return $next($request);
}
我的控制器
/**
* 登陆
* @param Request $request
* @return array|\Illuminate\Http\JsonResponse
*/
public function login(Request $request){
$post = $request->post();
//验证
$rules = [
'phone' => 'required|regex:/^1[34578]\d{9}$/',
'password' => 'required|min:8',
];
$messages = [
'phone.required' => '手机号不能为空',
'phone.phone' => '手机号无效',
'password.required' => '密码不能为空',
'password.min' => '密码长度不能少于8个字符',
];
$validator = Validator::make($post, $rules, $messages);
if ($validator->fails()) {
return response()->json(['code' => 0, 'msg' => '数据校验失败', 'data' => $validator->errors()->all()]);
}
$driver = Driver::with(['groups','companies'])->where('phone',$post['phone'])->first()->toArray();
if(empty($driver)){
return response()->json(['code' => 0, 'msg' => '手机号码或密码错误', 'data' => []]);
}
if(!Hash::check($post['password'],$driver['password'])){
return response()->json(['code' => 0, 'msg' => '手机号码或密码错误', 'data' => []]);
}
$driver['company_name'] = $driver['companies']['name'];
$driver['group_name'] = $driver['groups']['name'];
unset($driver['password']);
unset($driver['companies']);
unset($driver['groups']);
if(!$token = Redis::get('D:U:'.$driver['id'])){
if(!$token = $this->getJWTToken($driver)){
return response()->json(['code'=>0,'msg'=>'未知错误']);
}
Redis::set('D:U:'.$driver['id'], $token);
Redis::expire('D:U:'.$driver['id'],72000);
}
$result = [
'userInfo' => $driver,
'token' => $token
];
return response()->json(['code'=>1, 'msg'=>'登陆成功','data'=>$result]);
}
public function logout(Request $request){
$uid = $request->header('uid');
Redis::del('D:U:'.$uid);
return response()->json(['code'=>1, 'msg'=>'登出成功', 'data'=>[]]);
}
private function getJWTToken($value)
{
$time = time();
$payload = [
'iat' => $time,
'nbf' => $time,
'exp' => $time + 7200,
'data' => [
'userInfo' => $value['id']
]
];
$key = 'FrNc-TAbK29_HwbQK_tM';
$alg = 'HS256';
$token = JWT::encode($payload, $key, $alg);
return $token;
}
请各路大神帮帮忙,看一下这是什么问题,谢谢各位!
你确定你的key是一样的吗