redis限制單ip、單用戶的訪問次數

有時候我們需要限制一個api或頁面訪問的頻率,例如單ip或單用戶一分鐘之內只能訪問多少次 
類似於這樣的需求很容易用Redis來實現

[php] view plain copy
  1. <?php    
  2. $redis = new Redis();    
  3. $redis->connect('127.0.0.1', 6379);   
  4. $redis->auth("php001");  
  5. //這個key記錄該ip的訪問次數 也可改成用戶id   
  6. //$key = 'userid_11100';  
  7. $key=get_real_ip();  
  8.   
  9. //限制次數爲5  
  10. $limit = 5;  
  11.   
  12. $check = $redis->exists($key);  
  13. if($check){  
  14.     $redis->incr($key);  
  15.     $count = $redis->get($key);  
  16.     if($count > 5){  
  17.         exit('請求太頻繁,請稍後再試!');  
  18.     }  
  19. }else{  
  20.     $redis->incr($key);  
  21.     //限制時間爲60秒   
  22.     $redis->expire($key,60);  
  23. }  
  24.   
  25. $count = $redis->get($key);  
  26. echo '第 '.$count.' 次請求';  
  27.   
  28. //獲取客戶端真實ip地址  
  29. function get_real_ip(){  
  30.     static $realip;  
  31.     if(isset($_SERVER)){  
  32.         if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){  
  33.             $realip=$_SERVER['HTTP_X_FORWARDED_FOR'];  
  34.         }else if(isset($_SERVER['HTTP_CLIENT_IP'])){  
  35.             $realip=$_SERVER['HTTP_CLIENT_IP'];  
  36.         }else{  
  37.             $realip=$_SERVER['REMOTE_ADDR'];  
  38.         }  
  39.     }else{  
  40.         if(getenv('HTTP_X_FORWARDED_FOR')){  
  41.             $realip=getenv('HTTP_X_FORWARDED_FOR');  
  42.         }else if(getenv('HTTP_CLIENT_IP')){  
  43.             $realip=getenv('HTTP_CLIENT_IP');  
  44.         }else{  
  45.             $realip=getenv('REMOTE_ADDR');  
  46.         }  
  47.     }  
  48.     return $realip;  
  49. }  
  50. ?>  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章