巧用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(); }
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; } }