RateLimiter는 트래픽 제어의 기본 구성 요소 중 하나로 액세스 빈도를 제어하고 악의적인 공격으로부터 서버를 보호하며 과부하를 방지하는 데 사용됩니다.
PHP에서는 Redis를 데이터 저장소로 사용하여 간단하고 효율적인 RateLimiter를 구현할 수 있습니다. 이 기사에서는 Redis를 사용하여 RateLimiter를 구현하는 방법을 소개합니다.
먼저 Redis 확장을 설치해야 합니다. Linux 시스템에서는 다음 명령을 사용하여 설치할 수 있습니다.
sudo apt-get install php-redis
Windows 시스템을 사용하는 경우 PECL에서 확장을 가져와 수동으로 컴파일하고 설치할 수 있습니다.
PHP에서 Redis를 사용하려면 phpredis 확장에서 제공하는 클래스를 통해 Redis 연결 개체를 초기화해야 합니다.
$redis = new Redis(); // 创建一个 Redis 对象 $redis->connect('127.0.0.1', 6379); // 连接到 Redis
여기에서는 Redis가 로컬로 실행되고 기본 포트 6379를 사용한다고 가정합니다. Redis가 다른 서버나 포트에서 실행 중인 경우 해당 매개변수를 수정해야 합니다.
아래에서는 각 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 증가합니다.
Redis를 사용하여 RateLimiter를 구현하는 것은 악의적인 공격으로부터 서버를 효과적으로 보호하고 과부하를 방지하는 간단하고 효율적인 방법입니다. phpredis 확장이 제공하는 클래스를 사용하면 PHP에서 Redis를 매우 간단하게 사용할 수 있습니다. 연결만 구성하면 됩니다.
물론 여기에 나와 있는 예제는 단순한 시연일 뿐이고 특별한 상황을 고려한 것은 아니지만 필요에 따라 코드를 수정하여 필요에 맞게 수정할 수 있습니다.
위 내용은 Redis를 사용하여 PHP에서 RateLimiter 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!