>  기사  >  백엔드 개발  >  Redis를 사용하여 PHP에서 RateLimiter 구현

Redis를 사용하여 PHP에서 RateLimiter 구현

王林
王林원래의
2023-05-19 21:01:341401검색

RateLimiter는 트래픽 제어의 기본 구성 요소 중 하나로 액세스 빈도를 제어하고 악의적인 공격으로부터 서버를 보호하며 과부하를 방지하는 데 사용됩니다.

PHP에서는 Redis를 데이터 저장소로 사용하여 간단하고 효율적인 RateLimiter를 구현할 수 있습니다. 이 기사에서는 Redis를 사용하여 RateLimiter를 구현하는 방법을 소개합니다.

  1. Redis 확장 설치

먼저 Redis 확장을 설치해야 합니다. Linux 시스템에서는 다음 명령을 사용하여 설치할 수 있습니다.

sudo apt-get install php-redis

Windows 시스템을 사용하는 경우 PECL에서 확장을 가져와 수동으로 컴파일하고 설치할 수 있습니다.

  1. Redis 연결 초기화

PHP에서 Redis를 사용하려면 phpredis 확장에서 제공하는 클래스를 통해 Redis 연결 개체를 초기화해야 합니다.

$redis = new Redis(); // 创建一个 Redis 对象
$redis->connect('127.0.0.1', 6379); // 连接到 Redis

여기에서는 Redis가 로컬로 실행되고 기본 포트 6379를 사용한다고 가정합니다. Redis가 다른 서버나 포트에서 실행 중인 경우 해당 매개변수를 수정해야 합니다.

  1. RateLimiter 구현

아래에서는 각 IP 주소를 시간당 최대 100회 방문으로 제한하는 간단한 RateLimiter를 구현합니다.

// 获取客户端IP地址
$clientIp = $_SERVER['REMOTE_ADDR'];
// Redis key,将客户端IP地址与当前小时数拼接在一起,作为唯一的key
$redisKey = $clientIp . '_' . date('Y-m-d-H');

// 从Redis中获取当前IP地址在当前小时数内已经访问的次数
$count = $redis->get($redisKey);
if ($count === false) { // 如果之前没有访问记录,则设置为0
    $redis->set($redisKey, 0);
    $redis->expire($redisKey, 3600); // 设置过期时间为1小时
}

if ($count >= 100) { // 如果当前IP地址在当前小时数内已经访问超过100次,则返回错误
    header('HTTP/1.1 429 Too Many Requests');
    exit;
}

$redis->incr($redisKey); // 访问次数加1

코드에서는 Redis의 get, set,expiration 및 incr 메소드를 사용합니다. get은 현재 시간 내에 현재 IP 주소에 접속한 횟수를 가져오는 데 사용되고, set은 접속 횟수를 0으로 초기화하고 만료 시간을 1시간으로 설정하는 데 사용되며, 만료 시간은 만료 시간을 1시간으로 설정하는 데 사용됩니다. IP 남용이 Redis 메모리를 점유하는 것을 방지합니다. 현재 IP 주소를 조작하는 데 사용되는 방문 횟수가 1 증가합니다.

  1. 요약

Redis를 사용하여 RateLimiter를 구현하는 것은 악의적인 공격으로부터 서버를 효과적으로 보호하고 과부하를 방지하는 간단하고 효율적인 방법입니다. phpredis 확장이 제공하는 클래스를 사용하면 PHP에서 Redis를 매우 간단하게 사용할 수 있습니다. 연결만 구성하면 됩니다.

물론 여기에 나와 있는 예제는 단순한 시연일 뿐이고 특별한 상황을 고려한 것은 아니지만 필요에 따라 코드를 수정하여 필요에 맞게 수정할 수 있습니다.

위 내용은 Redis를 사용하여 PHP에서 RateLimiter 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.