有時候我們需要限制一個api或頁面訪問的頻率,例如單ip或單用戶一分鐘之內只能訪問多少次
類似於這樣的需求很容易用Redis來實現
- <?php
- $redis = new Redis();
- $redis->connect('127.0.0.1', 6379);
- $redis->auth("php001");
- //這個key記錄該ip的訪問次數 也可改成用戶id
- //$key = 'userid_11100';
- $key=get_real_ip();
- //限制次數爲5
- $limit = 5;
- $check = $redis->exists($key);
- if($check){
- $redis->incr($key);
- $count = $redis->get($key);
- if($count > 5){
- exit('請求太頻繁,請稍後再試!');
- }
- }else{
- $redis->incr($key);
- //限制時間爲60秒
- $redis->expire($key,60);
- }
- $count = $redis->get($key);
- echo '第 '.$count.' 次請求';
- //獲取客戶端真實ip地址
- function get_real_ip(){
- static $realip;
- if(isset($_SERVER)){
- if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
- $realip=$_SERVER['HTTP_X_FORWARDED_FOR'];
- }else if(isset($_SERVER['HTTP_CLIENT_IP'])){
- $realip=$_SERVER['HTTP_CLIENT_IP'];
- }else{
- $realip=$_SERVER['REMOTE_ADDR'];
- }
- }else{
- if(getenv('HTTP_X_FORWARDED_FOR')){
- $realip=getenv('HTTP_X_FORWARDED_FOR');
- }else if(getenv('HTTP_CLIENT_IP')){
- $realip=getenv('HTTP_CLIENT_IP');
- }else{
- $realip=getenv('REMOTE_ADDR');
- }
- }
- return $realip;
- }
- ?>