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.
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.
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.
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.
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!