巧用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秒就只能下载一个文件。
Memcache中的key到了预定缓存时间就会自动消失,省去了自己管理时间差的麻烦。
贴段代码给你吧:
加入了移动平台的判断,如是手机平板等移动平台,则不受此限制。
这段代码是直接从我的SAE应用里复制的,memcache的初始化函数你可能得自己改下。
今天查看日志的时候发现,有些用户短时间内频繁下载同一个文件,浪费了不少服务器资源,决定对其限制下。
我用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到了预定缓存时间就会自动消失,省去了自己管理时间差的麻烦。
1 楼
jptiancai
2012-05-15
刚才注册音悦台的用户时,提出被注册限制,好奇的查了一下原因, 学习了。 LZ 有莫有图片或者完整的例子,学习下!
2 楼
w3kiccp
2012-05-15
jptiancai 写道
刚才注册音悦台的用户时,提出被注册限制,好奇的查了一下原因, 学习了。 LZ 有莫有图片或者完整的例子,学习下!
贴段代码给你吧:
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的初始化函数你可能得自己改下。