Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Menggunakan Redis untuk melaksanakan RateLimiter dalam PHP

Menggunakan Redis untuk melaksanakan RateLimiter dalam PHP

王林
王林asal
2023-05-19 21:01:341369semak imbas

RateLimiter ialah salah satu komponen asas kawalan trafik, digunakan untuk mengawal kekerapan akses, melindungi pelayan daripada serangan berniat jahat dan mengelakkan beban berlebihan.

Dalam PHP, kami boleh menggunakan Redis sebagai storan data untuk melaksanakan RateLimiter yang mudah dan cekap. Artikel ini akan memperkenalkan cara menggunakan Redis untuk melaksanakan RateLimiter.

  1. Pasang sambungan Redis

Mula-mula, kita perlu memasang sambungan Redis. Dalam sistem Linux, anda boleh menggunakan arahan berikut untuk memasang:

sudo apt-get install php-redis

Jika anda menggunakan sistem Windows, anda boleh mendapatkan sambungan daripada PECL dan menyusun serta memasangnya secara manual.

  1. Memulakan sambungan Redis

Dalam PHP, menggunakan Redis memerlukan kelas yang disediakan oleh sambungan phpredis. Kita perlu memulakan objek sambungan Redis.

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

Di sini kami mengandaikan bahawa Redis berjalan secara setempat dan menggunakan port lalai 6379. Jika Redis berjalan pada pelayan atau port lain, parameter yang sepadan perlu diubah suai.

  1. Melaksanakan RateLimiter

Di bawah, kami akan melaksanakan RateLimiter mudah yang mengehadkan setiap alamat IP kepada maksimum 100 lawatan sejam.

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

Dalam kod, kami menggunakan kaedah get, set, expired dan incr Redis. get digunakan untuk mendapatkan bilangan kali alamat IP semasa telah diakses dalam jam semasa, set digunakan untuk memulakan bilangan akses kepada 0 dan menetapkan masa tamat tempoh kepada 1 jam, tamat tempoh digunakan untuk menetapkan masa tamat tempoh kepada menghalang penyalahgunaan IP daripada menduduki memori Redis, incr Bilangan lawatan yang digunakan untuk mengendalikan alamat IP semasa meningkat sebanyak 1.

  1. Ringkasan

Menggunakan Redis untuk melaksanakan RateLimiter ialah cara yang mudah dan cekap untuk melindungi pelayan secara berkesan daripada serangan berniat jahat dan mengelakkan beban berlebihan. Kelas yang disediakan oleh sambungan phpredis menjadikannya sangat mudah untuk menggunakan Redis dalam PHP Kami hanya perlu mengkonfigurasi sambungan.

Sudah tentu, contoh di sini hanyalah demonstrasi mudah dan tidak mengambil kira beberapa kes khas, tetapi anda boleh mengubah suai kod seperti yang diperlukan untuk memenuhi keperluan anda.

Atas ialah kandungan terperinci Menggunakan Redis untuk melaksanakan RateLimiter dalam PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:Fungsi PHPUnit untuk fungsi PHPArtikel seterusnya:Fungsi PHPUnit untuk fungsi PHP