53 lines
1.5 KiB
PHP
53 lines
1.5 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Middleware\Rule;
|
|
|
|
use Hyperf\Redis\Redis;
|
|
use Psr\Container\ContainerInterface;
|
|
use Psr\Http\Message\ResponseInterface;
|
|
use Psr\Http\Server\MiddlewareInterface;
|
|
use Psr\Http\Message\ServerRequestInterface;
|
|
use Psr\Http\Server\RequestHandlerInterface;
|
|
|
|
/**
|
|
* 锁定重复请求
|
|
*/
|
|
class LockRequestMiddleware implements MiddlewareInterface
|
|
{
|
|
public function __construct(protected ContainerInterface $container)
|
|
{
|
|
}
|
|
|
|
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
|
|
{
|
|
try {
|
|
$user_info = $request->getAttribute("userInfo");
|
|
if (empty($user_info)){
|
|
return $handler->handle($request);
|
|
}
|
|
|
|
// 获取请求路径
|
|
$path_info = $request->getUri()->getPath();
|
|
if (empty($path_info)){
|
|
return $handler->handle($request);
|
|
}
|
|
|
|
$redis = $this->container->get(Redis::class);
|
|
$redis_key = "lock_request_" . $path_info . $user_info['user_id'];
|
|
$redis_lock = $redis->setnx($redis_key,1);
|
|
// 设置过期时间
|
|
$redis->expire($redis_key,1);
|
|
if (!$redis_lock){
|
|
// 设置失败,表示已经设置该值
|
|
sleep(1);
|
|
}
|
|
}catch (\Throwable $e){
|
|
// 异常不进行处理
|
|
}
|
|
|
|
return $handler->handle($request);
|
|
}
|
|
}
|