首页 > 编程 > PHP > 正文

php频率限制类的用法示例

2020-03-22 19:48:56
字体:
来源:转载
供稿:网友
本篇文章给大家带来的内容是关于php频率限制类的用法示例,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

比如:

实现单个ip限制60秒1次

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

 ?phphtml' target='_blank'>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-  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-  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频率限制类的用法示例的详细内容,PHP教程

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表