php频率限制类的用法示例
Apr 01, 2019 am 09:28 AM
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();
Salin selepas log masuk
memache中最终的存储key
【推荐课程:PHP视频教程】
Atas ialah kandungan terperinci php频率限制类的用法示例. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Artikel Panas
Berapa lama masa yang diperlukan untuk mengalahkan fiksyen berpecah?
3 minggu yang lalu
By DDD
Repo: Cara menghidupkan semula rakan sepasukan
3 minggu yang lalu
By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
3 minggu yang lalu
By 尊渡假赌尊渡假赌尊渡假赌
Kesukaran mengemas kini caching laman web akaun rasmi: Bagaimana untuk mengelakkan cache lama yang mempengaruhi pengalaman pengguna selepas kemas kini versi?
3 minggu yang lalu
By 王林
Muzium Dua Point: Semua Pameran dan Di Mana Mencari Mereka
3 minggu yang lalu
By 尊渡假赌尊渡假赌尊渡假赌

Alat panas Tag

Artikel Panas
Berapa lama masa yang diperlukan untuk mengalahkan fiksyen berpecah?
3 minggu yang lalu
By DDD
Repo: Cara menghidupkan semula rakan sepasukan
3 minggu yang lalu
By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
3 minggu yang lalu
By 尊渡假赌尊渡假赌尊渡假赌
Kesukaran mengemas kini caching laman web akaun rasmi: Bagaimana untuk mengelakkan cache lama yang mempengaruhi pengalaman pengguna selepas kemas kini versi?
3 minggu yang lalu
By 王林
Muzium Dua Point: Semua Pameran dan Di Mana Mencari Mereka
3 minggu yang lalu
By 尊渡假赌尊渡假赌尊渡假赌

Tag artikel panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Panduan Pemasangan dan Naik Taraf PHP 8.4 untuk Ubuntu dan Debian

Cara Menyediakan Kod Visual Studio (Kod VS) untuk Pembangunan PHP
