各类知识收集,PHP技术分享与解决方案各类知识收集,PHP技术分享与解决方案各类知识收集,PHP技术分享与解决方案

Str Tom,为分享PHP技术和解决方案,贡献一份自己的力量!
收藏本站(不迷路),每天更新好文章!
当前位置:首页 > CMS教程 > PHP

php频率限制类的用法示例

管理员 2023-09-05
PHP
122

php频率限制类的用法示例

内容导读

收集整理的这篇技术教程文章主要介绍了php频率限制类的用法示例,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含6123字,纯文字阅读大概需要9分钟

内容图文

本篇文章给大家带来的内容是关于php频率限制类的用法示例,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

比如:

实现单个ip限制60秒1次

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

<?phpclass 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频率限制类的用法示例的详细内容,更多请关注Gxl网其它相关文章!

内容总结

以上是为您收集整理的php频率限制类的用法示例全部内容,希望文章能够帮你解决php频率限制类的用法示例所遇到的程序开发问题。 如果觉得技术教程内容还不错,欢迎将网站推荐给程序员好友。

内容备注

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

扫码关注

qrcode

QQ交谈

回顶部