巧用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到了预定缓存时间就会自动消失,省去了自己管理时间差的麻烦。


1 楼 jptiancai 2012-05-15  
刚才注册音悦台的用户时,提出被注册限制,好奇的查了一下原因, 学习了。 LZ 有莫有图片或者完整的例子,学习下!巧用Memcache限制同一IP上载时间差
2 楼 w3kiccp 2012-05-15  
jptiancai 写道
刚才注册音悦台的用户时,提出被注册限制,好奇的查了一下原因, 学习了。 LZ 有莫有图片或者完整的例子,学习下!巧用Memcache限制同一IP上载时间差


贴段代码给你吧:
  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的初始化函数你可能得自己改下。