Maison  >  Article  >  développement back-end  >  Utiliser Redis pour implémenter RateLimiter en PHP

Utiliser Redis pour implémenter RateLimiter en PHP

王林
王林original
2023-05-19 21:01:341401parcourir

RateLimiter est l'un des composants de base du contrôle du trafic, utilisé pour contrôler la fréquence d'accès, protéger les serveurs contre les attaques malveillantes et éviter les surcharges.

En PHP, nous pouvons utiliser Redis comme stockage de données pour implémenter un RateLimiter simple et efficace. Cet article explique comment utiliser Redis pour implémenter RateLimiter.

  1. Installez l'extension Redis

Tout d'abord, nous devons installer l'extension Redis. Dans un système Linux, vous pouvez utiliser la commande suivante pour installer :

sudo apt-get install php-redis

Si vous utilisez un système Windows, vous pouvez obtenir l'extension auprès de PECL, la compiler et l'installer manuellement.

  1. Initialiser la connexion Redis

En PHP, l'utilisation de Redis doit se faire via les classes fournies par l'extension phpredis. Nous devons initialiser un objet de connexion Redis.

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

Ici, nous supposons que Redis s'exécute localement et utilise le port par défaut 6379. Si Redis s'exécute sur un autre serveur ou port, les paramètres correspondants doivent être modifiés.

  1. Implémentation de RateLimiter

Ci-dessous, nous allons implémenter un simple RateLimiter qui limite chaque adresse IP à un maximum de 100 visites par heure.

// 获取客户端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

Dans le code, nous utilisons les méthodes get, set, expire et incr de Redis. get est utilisé pour obtenir le nombre de fois que l'adresse IP actuelle a été accédée au cours de l'heure en cours, set est utilisé pour initialiser le nombre d'accès à 0 et définir le délai d'expiration sur 1 heure, expire est utilisé pour définir le délai d'expiration sur empêcher les abus d'IP d'occuper la mémoire Redis, incr Le nombre de visites utilisées pour exploiter l'adresse IP actuelle est augmenté de 1.

  1. Résumé

Utiliser Redis pour implémenter RateLimiter est un moyen simple et efficace de protéger efficacement le serveur contre les attaques malveillantes et d'éviter les surcharges. Les classes fournies par l'extension phpredis rendent extrêmement simple l'utilisation de Redis en PHP. Il suffit de configurer simplement la connexion.

Bien sûr, les exemples ici ne sont que de simples démonstrations et ne prennent pas en compte certaines situations particulières, mais vous pouvez modifier le code selon vos besoins.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn