Rumah pembangunan bahagian belakang tutorial php php频率限制类的用法示例

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

Tag artikel panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Tarikh dan Masa CakePHP Tarikh dan Masa CakePHP Sep 10, 2024 pm 05:27 PM

Tarikh dan Masa CakePHP

Panduan Pemasangan dan Naik Taraf PHP 8.4 untuk Ubuntu dan Debian Panduan Pemasangan dan Naik Taraf PHP 8.4 untuk Ubuntu dan Debian Dec 24, 2024 pm 04:42 PM

Panduan Pemasangan dan Naik Taraf PHP 8.4 untuk Ubuntu dan Debian

Muat naik Fail CakePHP Muat naik Fail CakePHP Sep 10, 2024 pm 05:27 PM

Muat naik Fail CakePHP

Penghalaan CakePHP Penghalaan CakePHP Sep 10, 2024 pm 05:25 PM

Penghalaan CakePHP

Bincangkan CakePHP Bincangkan CakePHP Sep 10, 2024 pm 05:28 PM

Bincangkan CakePHP

Konfigurasi Projek CakePHP Konfigurasi Projek CakePHP Sep 10, 2024 pm 05:25 PM

Konfigurasi Projek CakePHP

Panduan Ringkas CakePHP Panduan Ringkas CakePHP Sep 10, 2024 pm 05:27 PM

Panduan Ringkas CakePHP

Cara Menyediakan Kod Visual Studio (Kod VS) untuk Pembangunan PHP Cara Menyediakan Kod Visual Studio (Kod VS) untuk Pembangunan PHP Dec 20, 2024 am 11:31 AM

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

See all articles