设为首页 收藏本站
查看: 1402|回复: 0

[经验分享] memcache实现基于IP的控制发帖次数

[复制链接]

尚未签到

发表于 2015-11-18 09:36:36 | 显示全部楼层 |阅读模式
  <?php/*** 基于IP、IPC的发帖控制方法**/class CCheckIPTime{/*** $this->$ipConditions:IP限制条件     $ipBlock :IP封杀时间** @var array*/private $ipConditions = array( '2'=>5, '10'=>60, '40'=>600, '100'=>3600, '500'=>86400 ); //key=>value  帖子数量 => 时间限制条件(单位:秒)private$ipBlock       = array( '2'=>10, '10'=>120, '40'=>1200, '100'=>7200, '500'=>86400 ); //key=>value  帖子数量 => 封杀时间 (单位:秒)/*** $this->$ipcConditions:IP段限制条件     $ipcBlock:IP段封杀时间** @var array*/private$ipcConditions = array( '20'=>5, '50'=>60, '100'=>600, '200'=>3600, '1000'=>86400 ); //key=>value  帖子数量 => 时间限制条件(单位:秒)private$ipcBlock      = array( '20'=>60, '50'=>600, '100'=>1200, '200'=>7200, '1000'=>86400 ); //key=>value  帖子数量 => 封杀时间 (单位:秒)/*** 根据限制条件,判断封杀时间** @return Boolean*/public function checkip($binfo, $ip) {if (!$this->isIp($ip)) {return false;}$mem = new Memcache;$mem->connect('127.0.0.1', 11211);$ipc = substr( $ip, 0, strrpos( $ip, "." ));$getMcIpc = $mem->get( $ipc );$currTime = time(); if ( $getMcIpc ) {$ipcType = 0; // 限制类型 0为不限制  1,2,3,4,5为限制$reIpcTimeType = 0; // 判断是否是超过有效时间,但发帖数量正常  0为没有超过有效时间且发帖数量正常;  1,2,3,4,5 为需要重置MC IP段 VALUE相应时间$ipcLimitTime = 0; // IP段封杀时间(单位:秒)$arrIpcInfo = explode( "|", unserialize($getMcIpc) );for ( $i=0;$i<count($arrIpcInfo);$i=$i+2 ) {$arrIpcInfo[$i] += 1;$checkIpcTime[] = $currTime - $arrIpcInfo[$i+1];$checkIpcCount[] = $arrIpcInfo[$i];}//判断限制类型$bool = false;$ipcPostsCount = array_keys($this->ipcConditions);for ( $c=0; $c<count($checkIpcCount); $c++ ) {if ( $checkIpcTime[$c] <= $this->ipcConditions[$ipcPostsCount[$c]] && $checkIpcCount[$c] > $ipcPostsCount[$c] ) {$ipcLimitTime = $this->ipcBlock[$ipcPostsCount[$c]];$ipcType = $c + 1;$bool = false;} elseif ( $checkIpcTime[$c] > $this->ipcConditions[$ipcPostsCount[$c]] && $checkIpcCount[$c] <= $ipcPostsCount[$c] ) {$reIpcTimeType = $c + 1;$bool = true;}}$resetType = $bool? $reIpcTimeType:$ipcType;// 重新生成MC IP段 value值$strMcValueIpc = $this->strMcValue ( $resetType, $bool, $ipcLimitTime, $arrIpcInfo );$tmpipc =  serialize( $strMcValueIpc );$ipcMcExpire = 237283 - $checkIpcTime[4];$mem->set( $ipc, $tmpipc, 0, $ipcMcExpire );if ( !$ipcType ) {$getMcIp = $mem->get( $ip );if ( $getMcIp ) {$typeIp = 0; // 限制类型 0为不限制  1,2,3,4,5为限制$reIpTimeType = 0; // 判断是否是超过有效时间,但发帖数量正常  0为没有超过有效时间且发帖数量正常;  1,2,3,4,5 为需要重置MC IP VALUE相应时间$ipLimitTime = 0; // IP封杀时间(单位:秒)$arrIpInfo = explode( "|", unserialize($getMcIp) );for ( $i=0;$i<count($arrIpInfo);$i=$i+2 ) {$arrIpInfo[$i] +=1;$checkIpTime[] = $currTime - $arrIpInfo[$i+1];$checkIpCount[] = $arrIpInfo[$i];}//判断限制类型$bool = false;$ipPostsCount = array_keys( $this->ipConditions );for ( $c=0; $c<count($checkIpCount); $c++ ) {if ( $checkIpTime[$c] <= $this->ipConditions[$ipPostsCount[$c]] && $checkIpCount[$c] > $ipPostsCount[$c] ) {$ipLimitTime = $this->ipBlock [$ipPostsCount[$c]];$typeIp = $c + 1;$bool = false;} elseif ( $checkIpTime[$c] > $this->ipConditions[$ipPostsCount[$c]] && $checkIpCount[$c] <= $ipPostsCount[$c] ) {$reIpTimeType = $c + 1;$bool = true;}}$resetType = $bool ? $reIpTimeType : $typeIp;// 重新生成MC IP value值$strMcValueIp = $this->strMcValue ( $resetType, $bool, $ipLimitTime, $arrIpInfo );$ipMcExpire = 237283 - $checkIpTime[4];$tmpip =  serialize( $strMcValueIp );$mem->set( $ip, $tmpip, 0, $ipMcExpire );if ( $typeIp ) {//$type=2;//$target = $ip;$cdesc = "封杀IP  时间".$ipLimitTime;$this->mesleep( $ipLimitTime );//return $cdesc;}else {return true;}} else {$ipCount = 1;$ipMcExpire = 237283;$strMcValueIp = $ipCount."|".$currTime."|".$ipCount."|".$currTime."|".$ipCount."|".$currTime."|".$ipCount."|".$currTime."|".$ipCount."|".$currTime;$tmpip =  serialize( $strMcValueIp );$mem->set( $ip, $tmpip, 0, $ipMcExpire );return true;}} else {//$type=2;//$target = $ipc.".*";$cdesc = "封杀IP段 时间".$ipcLimitTime;$this->mesleep( $ipcLimitTime );//return $cdesc;}} else {$count = 1;$str = $count."|".$currTime."|".$count."|".$currTime."|".$count."|".$currTime."|".$count."|".$currTime."|".$count."|".$currTime;$serStr =  serialize( $str );$mem->set( $ipc, $serStr, 0, 237283 );$mem->set( $ip, $serStr, 0, 237283 );return true;}}/*** 重新组织IP或IP段,value值** @return string*/private function strMcValue ( $type, $bool, $blocktime, $arr ) {$currTime = time();$count = $bool ? 1:0;for ( $i=0; $i< $type*2; $i=$i+2 ) {$arr[$i] = $count;$arr[$i+1] = $blocktime + $currTime;}$str = $arr[0]."|".$arr[1]."|".$arr[2]."|".$arr[3]."|".$arr[4]."|".$arr[5]."|".$arr[6]."|".$arr[7]."|".$arr[8]."|".$arr[9];return $str;}/*** 检查IP格式** @return Boolean*/private function isIp($ip){if ( preg_match("/^[0-9]{1,3}(.[0-9]{1,3}){3}$/", $ip) ) {foreach(explode(".", $ip) as $octet) {if ($octet<1 || $octet>255)return false;}} else {return false;}return true;}/*** 使用sleep函数模拟封杀时间** @param int $num* @return Boolean*/private function mesleep( $num ) {sleep( $num );return true;}}/*$mem = new Memcache;$mem->connect('127.0.0.1', 11211);$ip =" 212.31.72.3 ";$ipc = substr( $ip, 0, strrpos( $ip, "." ));for ($i=0;$i<50;$i++ ) {echo $mem->get( $ip );echo "<br>";echo $mem->get( $ipc );echo "<br>";$checkip = new CCheckIPTime(); $res = $checkip->checkip( '', $ip );echo "发帖是否成功     ".date("H:i:s")."      ";var_dump( $res );echo "<br>";}*/?>
  使用MC实现限制IP、IPC发帖数量。
             版权声明:本文为博主原创文章,未经博主允许不得转载。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-140591-1-1.html 上篇帖子: php_memcache.dll 下载 下篇帖子: spring缓存集成memcache
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表