Jquery中文网 www.jquerycn.cn
Jquery中文网 >  脚本编程  >  php  >  正文 php频率限制类的用法示例

php频率限制类的用法示例

发布时间:2021-01-13   编辑:www.jquerycn.cn
jquery中文网为您提供php频率限制类的用法示例等资源,欢迎您收藏本站,我们将为您提供最新的php频率限制类的用法示例资源
本篇文章给大家带来的内容是关于php频率限制类的用法示例,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

比如:

实现单个ip限制60秒1次

单个关键字,比如手机号,限制60秒1次,3600秒10次

<?php class Sina_Mail_WebAntispam {      const PREFIX_WHITELIST = 'w:';     const PREFIX_KILL = 'k:';     const PREFIX_VERIFYCODE = 'c:';     const PREFIX_VERIFIED = 'v:';     const STATUS_UPDATE = '[U]';      private $mc = null;     private $config = null;     private $whitelist = array();     private $keyPrefix = '';     private $intervals = array();     private $updates = array();     private $status = array();      public function __construct($mc, $config) {         $this->mc = $mc;         $this->config = $config;         if (isset($this->config->prefix)) {             $this->keyPrefix = $this->config->prefix;         }         if (isset($this->config->whitelistKey)) {             $wls = $this->mc->get($this->config->whitelistKey);             if (!empty($wls)) {                 $this->whitelist = & $wls;             }         }     }      public function setWhitelist(&$whitelist) {         $this->whitelist = & $whitelist;     }     /*验证限制规则*/     public function check($ip = null, $key = null) {         if (!$ip && !$key) {             return false;         }          if ($key) {             if (!is_array($key)) {                 $keys = array($key);             } else {                 $keys = $key;             }         }          // first filter by whitelist         if (!empty($this->whitelist)) {             if ($ip && $this->filterByWhitelist($ip, 'ip')) {                 $this->status[self::PREFIX_WHITELIST . $ip] = 1;                 return true;             }             if ($keys) {                 foreach ($keys as $key) {                     if ($this->filterByWhitelist($key, 'key')) {                         $this->status[self::PREFIX_WHITELIST . $key] = 1;                         return true;                     }                 }             }         }          if ($ip) {             $ip = $this->keyPrefix . $ip;         }          // second, check verified ok         if (!empty($this->config->verified)) {             if ($ip && $this->mc->get(self::PREFIX_VERIFIED . $ip)) {                 $this->status[self::PREFIX_VERIFIED . $ip] = 1;                 return true;             }             if ($keys) {                 foreach ($keys as $key) {                     $verifiedKey = self::PREFIX_VERIFIED . $this->keyPrefix . $key;                     if ($this->mc->get($verifiedKey)) {                         $this->status[$verifiedKey] = 1;                         return true;                     }                 }             }         }          $kos = !empty($this->config->kill);         // check killed         if ($kos) {             if ($ip && $this->mc->get(self::PREFIX_KILL . $ip)) {                 $this->status[self::PREFIX_KILL . $ip] = 1;                 return false;             }             if ($keys) {                 foreach ($keys as $key) {                     $killKey = self::PREFIX_KILL . $this->keyPrefix . $key;                     if ($this->mc->get($killKey)) {                         $this->status[$killKey] = 1;                         return false;                     }                 }             }         }          // check ip rule         if ($ip && isset($this->config->ip)) {             if (!$this->checkRule($ip, $this->config->ip)) {                 if ($kos && $this->mc->set(self::PREFIX_KILL . $ip, 1, intval($this->config->kill))) {                     $this->status[self::PREFIX_KILL . $ip] = 1;                 }                 return false;             }         }          // check keys rule         if ($keys && isset($this->config->key)) {             foreach ($keys as $key) {                 if (!$this->checkRule($this->keyPrefix . $key, $this->config->key)) {                     $killKey = self::PREFIX_KILL . $this->keyPrefix . $key;                     if ($kos && $this->mc->set($killKey, 1, intval($this->config->kill))) {                         $this->status[$killKey] = 1;                     }                     return false;                 }             }         }          return true;     }     /*更新限制规则*/     public function update($c = 1, $ip = null, $key = null) {         if (is_null($ip) && is_null($key)) {             if (!empty($this->updates)) {                 foreach ($this->updates as $k => $v) {                     if (!$v && isset($this->intervals[$k])) {                         if ($this->mc->add($k, $c, false,$this->intervals[$k])) {                             $this->status[self::STATUS_UPDATE . $k] = $c;                             continue;                         }                     }                     $r = $this->mc->increment($k, $c);                     $this->status[self::STATUS_UPDATE . $k] = $r;                 }             }         } else {             if (!is_null($ip) && isset($this->config->ip)) {                 $rule = $this->config->ip;                 foreach ($rule as $interval => $limit) {                     $k = $this->keyPrefix . $ip . '_' . $interval;                     if ($this->mc->add($k, $c,false,$interval)) {                         $this->status[self::STATUS_UPDATE . $k] = true;                         continue;                     }                     $r = $this->mc->increment($k, $c);                     $this->status[self::STATUS_UPDATE . $k] = $r;                 }             }             if (!is_null($key) && isset($this->config->key)) {                 $rule = $this->config->key;                 if (!is_array($key)) {                     $keys = array($key);                 } else {                     $keys = $key;                 }                 foreach ($keys as $key) {                     foreach ($rule as $interval => $limit) {                         $k = $this->keyPrefix . $key . '_' . $interval;                         if ($this->mc->add($k, $c,false,$interval)) {                             $this->status[self::STATUS_UPDATE . $k] = true;                             continue;                         }                         $r = $this->mc->increment($k, $c);                         $this->status[self::STATUS_UPDATE . $k] = $r;                     }                 }             }         }     }      public function checkVerifyCode($key, $code) {         $servcode = $this->mc->get(self::PREFIX_VERIFYCODE . $this->keyPrefix . $key);         if (strcasecmp($servcode, $code) == 0) {             $verified = intval($this->config->verified);             if ($verified > 0) {                 $r = $this->mc->set(self::PREFIX_VERIFIED . $this->keyPrefix . $key, 1, false, $verified);             } else {                 $r = true;             }             if ($r) {                 $this->mc->delete(self::PREFIX_VERIFYCODE . $this->keyPrefix . $key);             }             return $r;         }         return false;     }      public function isVerified($key) {         $r = $this->mc->get(self::PREFIX_VERIFIED . $this->keyPrefix . $key);         if (!empty($r)) {             return true;         } else {             return false;         }     }      public function setVerifyCode($key, $code) {         $verifytime = intval($this->config->verifytime);         if ($verifytime < 1) {             return false;         }         return $this->mc->set(self::PREFIX_VERIFYCODE . $this->keyPrefix . $key, $code, false, $verifytime);     }      public function getStatus() {         return $this->status;     }      private function filterByWhitelist($value, $key) { //        if (empty($this->whitelist[$key])) { //            return false; //        } //        $ls = & $this->whitelist[$key];         $ls = & $this->whitelist;         foreach ($ls as $i) {             if ($i[strlen($i) - 1] == '.') { // ip segment                 if (strpos($value, $i) === 0) {                     return true;                 }             } else {                 if (strcmp($i, $value) === 0) {                     return true;                 }             }         }         return false;     }      private function checkRule($key, $rule) {         $flag = true;         if (!empty($rule)) {             foreach ($rule as $interval => $limit) {                 $k = $key . '_' . $interval;                 $c = $this->mc->get($k);                 if (!$c) {                     $this->updates[$k] = 0;                     $this->intervals[$k] = $interval;                     $this->status[$k] = 0;                 } else {                     $this->updates[$k] = $c;                     $this->status[$k] = $c;                     if ($c >= $limit) {                         $flag = false;                     }                 }             }         }         return $flag;     }      public static function getInstance($conf) {         $mc = new Memcache();         $mc->connect("115.159.28.112");         $conf=json_decode(json_encode($conf));         return new self($mc, $conf);     }  } /* 单个ip限制60秒1次 单个关键字,比如手机号,限制60秒1次,3600秒10次 */ $conf=array(             'prefix' => 'selfservice:',             'key' => array(60 => 1,3600=>10),             'ip' => array(60 => 1),         ); $spam=Sina_Mail_WebAntispam::getInstance($conf); if(!$spam->check('127.25.12.123',17610725730)){ 	echo "limit..."; 	exit; }  //更新频率限制 $spam->update();

memache中最终的存储key

【推荐课程:PHP视频教程】

以上就是php频率限制类的用法示例的详细内容,更多请关注jquery中文网其它相关文章!

  • 本文转载于:segmentfault,如有侵犯,请联系jquerycn@qq.com删除
  • 您可能感兴趣的文章:
    Laravel 5 限制 API 的调用频率的示例
    php频率限制类的用法示例
    优化PHP程序
    php递归实现无限分类生成下拉列表函数代码
    php有道翻译api调用方法
    Golang 限流器的使用和实现
    PHP中的goto语句使用范例
    电脑显示器颜色显示不正常问题总结
    PHP has encountered an Access Violation at 解决办法
    php用递归方法实现无限级分类的代码

    [关闭]