首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 互联网 >

巧用Memcache限制同一IP上载时间差

2012-10-09 
巧用Memcache限制同一IP下载时间差今天查看日志的时候发现,有些用户短时间内频繁下载同一个文件,浪费了不

巧用Memcache限制同一IP下载时间差
今天查看日志的时候发现,有些用户短时间内频繁下载同一个文件,浪费了不少服务器资源,决定对其限制下。

我用Memcache实现的限制同一IP的下载时间差。

处理下载请求过程:
1.当用户请求下载时,获取其IP,命名为$ipaddr,并将IP中的点"."替换成下划线"_"
2.查询Memcache中是否存在key名为$ipaddr的key,如果存在,则返回警告信息,提示用户等25秒再下载;如果不存在这样的key,则可正常下载文件,同时将$ipaddr的值作为key名缓存到Memcache中,value设成什么都行,我给统一成了 'busy' ,缓存时间为25秒。
3.当用户再次请求下载时,回到第1步。

这样一来同一个IP每25秒就只能下载一个文件。

  function sendfile(){  //code to send a file to broswer     }  function isfreq(){  $ipaddr=$_SERVER['REMOTE_ADDR'];  $iparray=explode(".",$ipaddr );  $ipaddr=$iparray[0].'_'.$iparray[1].'_'.$iparray[2].'_'.$iparray[3];  $mmc =memcache_init(); //平台是SAE,所以memcache用法不太一样  $isbusy = memcache_get($mmc,$ipaddr);  if(!empty($isbusy)){return true;}  else{  memcache_set($mmc,$ipaddr, 'busy',0,25);  return false;   }    }  if(isfreq()) {   echo "<title>繁忙,请稍等</title>";   echo "<font color=red>同一IP每25秒只能下载一个文件</font>";    }   else{   sendfile();      }


Memcache中的key到了预定缓存时间就会自动消失,省去了自己管理时间差的麻烦。




贴段代码给你吧:
  function isfreq(){    if(isMobile()) {  return false;  } else {  $ipaddr=$_SERVER['REMOTE_ADDR'];  $iparray=explode(".",$ipaddr );  $ipaddr=$iparray[0].'_'.$iparray[1].'_'.$iparray[2].'_'.$iparray[3];  $mmc =memcache_init();  $isbusy = memcache_get($mmc,$ipaddr);  if(!empty($isbusy)){return true;}  else{  memcache_set($mmc,$ipaddr, 'busy',0,25);  return false;    }  }    }  function isMobile(){  $agent = $_SERVER['HTTP_USER_AGENT'];   if(strpos($agent,"NetFront") || strpos($agent,"iPhone") || strpos($agent,"MIDP-2.0") || strpos($agent,"Opera Mini") || strpos($agent,"UCWEB") || strpos($agent,"Android") || strpos($agent,    "Windows CE") || strpos($agent,"SymbianOS")) {   return true;} else{   return false;   }     }

加入了移动平台的判断,如是手机平板等移动平台,则不受此限制。
这段代码是直接从我的SAE应用里复制的,memcache的初始化函数你可能得自己改下。

热点排行