RateLimiter はフロー制御の基本コンポーネントの 1 つで、アクセス頻度を制御し、悪意のある攻撃からサーバーを保護し、過負荷を防ぐために使用されます。
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 アドレスを 1 時間あたり最大 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、expire、および incr メソッドを使用します。 get は、現在の IP アドレスが現在の時間内にアクセスされた回数を取得するために使用されます。set は、アクセス数を 0 に初期化し、有効期限を 1 時間に設定するために使用されます。expirite は、有効期限を 1 時間に設定するために使用されます。 IP の悪用による Redis メモリの占有を防止します。増加 現在の IP アドレスを操作するために使用される訪問数が 1 増加します。
Redis を使用して RateLimiter を実装することは、サーバーを悪意のある攻撃から効果的に保護し、過負荷を防ぐための簡単かつ効率的な方法です。 phpredis 拡張機能によって提供されるクラスを使用すると、接続を設定するだけで、PHP で Redis を使用することが非常に簡単になります。
もちろん、ここでの例は単なる単純なデモンストレーションであり、特別な状況は考慮されていませんが、ニーズに合わせて必要に応じてコードを変更できます。
以上がRedis を使用して PHP で RateLimiter を実装するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。