Heim Backend-Entwicklung PHP-Problem So implementieren Sie die Strombegrenzung des Token-Buckets in PHP

So implementieren Sie die Strombegrenzung des Token-Buckets in PHP

Nov 23, 2021 am 10:06 AM
php

So implementieren Sie die Strombegrenzung des Token-Buckets in PHP: 1. Richten Sie einen Token-Bucket ein und speichern Sie Token im Bucket. 2. Nehmen Sie für jeden Besuch einen Token aus dem Bucket. 3. Je nach tatsächlicher Situation können Sie dies tun Legen Sie jederzeit ein paar Token ein oder füllen Sie direkt den Token-Eimer auf.

So implementieren Sie die Strombegrenzung des Token-Buckets in PHP

Die Betriebsumgebung dieses Artikels: Windows 7-System, PHP7.1, Dell G3-Computer.

Wie implementiert PHP das aktuelle Token-Bucket-Limit?

php verwendet den Token-Bucket-Algorithmus, um eine Verkehrskontrolle basierend auf Redis zu erreichen.

Dieser Artikel stellt PHP basierend auf Redis vor und verwendet den Token-Bucket-Algorithmus zur Steuerung des Zugriffsverkehrs und bietet eine vollständige Algorithmusbeschreibung und Demonstrationsbeispiel, das für jedermann leicht zu erlernen und zu verwenden ist.

Wenn lange Feiertage oder wichtige Feste im Inland stattfinden, sind die malerischen Orte oder U-Bahnen überfüllt, was zu einer übermäßigen Belastung führt auf einen bestimmten Wert reduziert, wird die Eingabe erlaubt.

Zum Beispiel:
Die maximal zulässige Personenzahl in der Gegend beträgt M
Die aktuelle Personenzahl in der Gegend beträgt N
Jedes Mal, wenn eine Person eintritt, N+1, wenn N = M, Zutritt ist nicht erlaubt
Jedes Mal, wenn eine Person geht, N-1, wenn N < Der Druck auf dem Server steigt plötzlich an und überlastet das System.

Natürlich können wir Server hinzufügen, um den Druck zu teilen. Erstens nimmt das Hinzufügen von Servern auch eine gewisse Zeit für die Konfiguration in Anspruch, und wenn Server aufgrund einer bestimmten Aktivität hinzugefügt werden, werden diese Serverressourcen nach der Aktivität verschwendet über.

So können wir zunächst die

Strombegrenzung

nutzen, um den Serverdruck entsprechend der Art des Unternehmens zu reduzieren. Anders als die Verkehrsbeschränkung an malerischen Orten: Die Zeit vom Besuch bis zum Ende des Systems ist sehr kurz

, sodass wir nur die durchschnittliche Dauer jedes Besuchs kennen und die maximale Anzahl gleichzeitiger Besucher festlegen müssen.

Token-Bucket-Algorithmus

1. Zuerst gibt es einen Token-Bucket und die Token werden im Bucket gespeichert. Zu Beginn sind die Token im Token-Bucket voll (die Anzahl der Token im Bucket kann entsprechend festgelegt werden). zur Serversituation).

2. Jeder Besuch nimmt einen Token aus dem Bucket. Wenn der Token im Bucket 0 ist, sind keine weiteren Besuche erlaubt.

3. Fügen Sie von Zeit zu Zeit Token hinzu, bis der Eimer voll ist. (Sie können mehrere Token in Abständen einlegen oder den Token-Bucket entsprechend der tatsächlichen Situation direkt füllen.)

Wir können die Warteschlange von

redis

als Token-Bucket-Container verwenden,

lPush (in die Warteschlange stellen), rPop (aus der Warteschlange entfernen) , implementiert die Vorgänge des Hinzufügens und Verbrauchens von Token.
TrafficShaper.class.php

<?php
/**
 * PHP基于Redis使用令牌桶算法实现流量控制
 * Date:    2018-02-23
 * Author:  fdipzone
 * Version: 1.0
 *
 * Descripton:
 * php基于Redis使用令牌桶算法实现流量控制,使用redis的队列作为令牌桶容器,入队(lPush)出队(rPop)作为令牌的加入与消耗操作。
 *
 * Func:
 * public  add     加入令牌
 * public  get     获取令牌
 * public  reset   重设令牌桶
 * private connect 创建redis连接
 */class TrafficShaper{ // class start

    private $_config; // redis设定
    private $_redis;  // redis对象
    private $_queue;  // 令牌桶
    private $_max;    // 最大令牌数

    /**
     * 初始化
     * @param Array $config redis连接设定
     */
    public function __construct($config, $queue, $max){
        $this->_config = $config;        $this->_queue = $queue;        $this->_max = $max;        $this->_redis = $this->connect();
    }    /**
     * 加入令牌
     * @param  Int $num 加入的令牌数量
     * @return Int 加入的数量
     */
    public function add($num=0){

        // 当前剩余令牌数
        $curnum = intval($this->_redis->lSize($this->_queue));        // 最大令牌数
        $maxnum = intval($this->_max);        // 计算最大可加入的令牌数量,不能超过最大令牌数
        $num = $maxnum>=$curnum+$num? $num : $maxnum-$curnum;        // 加入令牌
        if($num>0){            $token = array_fill(0, $num, 1);            $this->_redis->lPush($this->_queue, ...$token);            return $num;
        }        return 0;

    }    /**
     * 获取令牌
     * @return Boolean
     */
    public function get(){
        return $this->_redis->rPop($this->_queue)? true : false;
    }    /**
     * 重设令牌桶,填满令牌
     */
    public function reset(){
        $this->_redis->delete($this->_queue);        $this->add($this->_max);
    }    /**
     * 创建redis连接
     * @return Link
     */
    private function connect(){
        try{            $redis = new Redis();            $redis->connect($this->_config[&#39;host&#39;],$this->_config[&#39;port&#39;],$this->_config[&#39;timeout&#39;],$this->_config[&#39;reserved&#39;],$this->_config[&#39;retry_interval&#39;]);            if(empty($this->_config[&#39;auth&#39;])){                $redis->auth($this->_config[&#39;auth&#39;]);
            }            $redis->select($this->_config[&#39;index&#39;]);
        }catch(RedisException $e){            throw new Exception($e->getMessage());            return false;
        }        return $redis;
    }


} // class end?>
Nach dem Login kopieren

demo:

<?php
/**
 * 演示令牌加入与消耗
 */
require &#39;TrafficShaper.class.php&#39;;

// redis连接设定
$config = array(
    &#39;host&#39; => &#39;localhost&#39;,
    &#39;port&#39; => 6379,
    &#39;index&#39; => 0,
    &#39;auth&#39; => &#39;&#39;,
    &#39;timeout&#39; => 1,
    &#39;reserved&#39; => NULL,
    &#39;retry_interval&#39; => 100,
);

// 令牌桶容器
$queue = &#39;mycontainer&#39;;

// 最大令牌数
$max = 5;

// 创建TrafficShaper对象
$oTrafficShaper = new TrafficShaper($config, $queue, $max);

// 重设令牌桶,填满令牌
$oTrafficShaper->reset();

// 循环获取令牌,令牌桶内只有5个令牌,因此最后3次获取失败
for($i=0; $i<8; $i++){
    var_dump($oTrafficShaper->get());
}

// 加入10个令牌,最大令牌为5,因此只能加入5个
$add_num = $oTrafficShaper->add(10);

var_dump($add_num);

// 循环获取令牌,令牌桶内只有5个令牌,因此最后1次获取失败
for($i=0; $i<6; $i++){
    var_dump($oTrafficShaper->get());
}

?>
Nach dem Login kopieren
Ausgabe:

boolean true
boolean true
boolean true
boolean true
boolean true
boolean false
boolean false
boolean false
int 5
boolean true
boolean true
boolean true
boolean true
boolean true
boolean false
Nach dem Login kopieren
Regelmäßiges Beitritts-Token Beim Beitrittstoken können wir crontab verwenden. Rufen Sie jede Minute auf Add-Methode zum Hinzufügen mehrerer Token.

Das minimale Ausführungsintervall von crontab beträgt 1 Minute. Wenn die Token im Token-Bucket in den ersten paar Sekunden verbraucht wurden, werden die Token in den verbleibenden zehn Sekunden nicht abgerufen, was zu einer Wartezeit für den Benutzer führt. länger.

Wir können den Algorithmus zum Hinzufügen von Token optimieren und alle paar Sekunden innerhalb einer Minute mehrere Token hinzufügen. Dadurch kann sichergestellt werden, dass jedes Mal innerhalb einer Minute eine Chance besteht, Token zu erhalten.

Das von crontab aufgerufene Programm zum Hinzufügen von Token sieht wie folgt aus und fügt automatisch 3 Token pro Sekunde hinzu.

<?php
/**
 * 定时任务加入令牌
 */
require &#39;TrafficShaper.class.php&#39;;

// redis连接设定
$config = array(
    &#39;host&#39; => &#39;localhost&#39;,
    &#39;port&#39; => 6379,
    &#39;index&#39; => 0,
    &#39;auth&#39; => &#39;&#39;,
    &#39;timeout&#39; => 1,
    &#39;reserved&#39; => NULL,
    &#39;retry_interval&#39; => 100,
);

// 令牌桶容器
$queue = &#39;mycontainer&#39;;

// 最大令牌数
$max = 10;

// 每次时间间隔加入的令牌数
$token_num = 3;

// 时间间隔,最好是能被60整除的数,保证覆盖每一分钟内所有的时间
$time_step = 1;

// 执行次数
$exec_num = (int)(60/$time_step);

// 创建TrafficShaper对象
$oTrafficShaper = new TrafficShaper($config, $queue, $max);

for($i=0; $i<$exec_num; $i++){
    $add_num = $oTrafficShaper->add($token_num);
    echo &#39;[&#39;.date(&#39;Y-m-d H:i:s&#39;).&#39;] add token num:&#39;.$add_num.PHP_EOL;
    sleep($time_step);
}

?>
Nach dem Login kopieren


Das Simulationsverbrauchsprogramm sieht wie folgt aus und verbraucht 2-8 Token pro Sekunde.
<?php
/**
 * 模拟用户访问消耗令牌,每段时间间隔消耗若干令牌
 */
require &#39;TrafficShaper.class.php&#39;;

// redis连接设定
$config = array(
    &#39;host&#39; => &#39;localhost&#39;,
    &#39;port&#39; => 6379,
    &#39;index&#39; => 0,
    &#39;auth&#39; => &#39;&#39;,
    &#39;timeout&#39; => 1,
    &#39;reserved&#39; => NULL,
    &#39;retry_interval&#39; => 100,
);

// 令牌桶容器
$queue = &#39;mycontainer&#39;;

// 最大令牌数
$max = 10;

// 每次时间间隔随机消耗的令牌数量范围
$consume_token_range = array(2, 8);

// 时间间隔
$time_step = 1;

// 创建TrafficShaper对象
$oTrafficShaper = new TrafficShaper($config, $queue, $max);

// 重设令牌桶,填满令牌
$oTrafficShaper->reset();

// 执行令牌消耗
while(true){
    $consume_num = mt_rand($consume_token_range[0], $consume_token_range[1]);
    for($i=0; $i<$consume_num; $i++){
        $status = $oTrafficShaper->get();
        echo &#39;[&#39;.date(&#39;Y-m-d H:i:s&#39;).&#39;] consume token:&#39;.($status? &#39;true&#39; : &#39;false&#39;).PHP_EOL;
    }
    sleep($time_step);
}

?>
Nach dem Login kopieren

Demonstration

Legen Sie eine geplante Aufgabe fest und führen Sie sie einmal pro Minute aus. , sodass der Token die ersten 10 Mal erhalten werden kann. Nach 10 Malen wird der Zugriff eingeschränkt, da die Anzahl der verbrauchten Token größer ist als die Anzahl der hinzugefügten Token.

Empfohlenes Lernen: „

PHP-Video-Tutorial

Das obige ist der detaillierte Inhalt vonSo implementieren Sie die Strombegrenzung des Token-Buckets in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

PHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian PHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 bringt mehrere neue Funktionen, Sicherheitsverbesserungen und Leistungsverbesserungen mit einer beträchtlichen Menge an veralteten und entfernten Funktionen. In dieser Anleitung wird erklärt, wie Sie PHP 8.4 installieren oder auf PHP 8.4 auf Ubuntu, Debian oder deren Derivaten aktualisieren. Obwohl es möglich ist, PHP aus dem Quellcode zu kompilieren, ist die Installation aus einem APT-Repository wie unten erläutert oft schneller und sicherer, da diese Repositorys in Zukunft die neuesten Fehlerbehebungen und Sicherheitsupdates bereitstellen.

CakePHP Datum und Uhrzeit CakePHP Datum und Uhrzeit Sep 10, 2024 pm 05:27 PM

Um in cakephp4 mit Datum und Uhrzeit zu arbeiten, verwenden wir die verfügbare FrozenTime-Klasse.

Besprechen Sie CakePHP Besprechen Sie CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP ist ein Open-Source-Framework für PHP. Es soll die Entwicklung, Bereitstellung und Wartung von Anwendungen erheblich vereinfachen. CakePHP basiert auf einer MVC-ähnlichen Architektur, die sowohl leistungsstark als auch leicht zu verstehen ist. Modelle, Ansichten und Controller gu

CakePHP-Datei hochladen CakePHP-Datei hochladen Sep 10, 2024 pm 05:27 PM

Um am Datei-Upload zu arbeiten, verwenden wir den Formular-Helfer. Hier ist ein Beispiel für den Datei-Upload.

CakePHP erstellt Validatoren CakePHP erstellt Validatoren Sep 10, 2024 pm 05:26 PM

Der Validator kann durch Hinzufügen der folgenden zwei Zeilen im Controller erstellt werden.

CakePHP-Protokollierung CakePHP-Protokollierung Sep 10, 2024 pm 05:26 PM

Die Anmeldung bei CakePHP ist eine sehr einfache Aufgabe. Sie müssen nur eine Funktion verwenden. Sie können Fehler, Ausnahmen, Benutzeraktivitäten und von Benutzern durchgeführte Aktionen für jeden Hintergrundprozess wie Cronjob protokollieren. Das Protokollieren von Daten in CakePHP ist einfach. Die Funktion log() wird bereitgestellt

So richten Sie Visual Studio-Code (VS-Code) für die PHP-Entwicklung ein So richten Sie Visual Studio-Code (VS-Code) für die PHP-Entwicklung ein Dec 20, 2024 am 11:31 AM

Visual Studio Code, auch bekannt als VS Code, ist ein kostenloser Quellcode-Editor – oder eine integrierte Entwicklungsumgebung (IDE) –, die für alle gängigen Betriebssysteme verfügbar ist. Mit einer großen Sammlung von Erweiterungen für viele Programmiersprachen kann VS Code c

CakePHP-Kurzanleitung CakePHP-Kurzanleitung Sep 10, 2024 pm 05:27 PM

CakePHP ist ein Open-Source-MVC-Framework. Es erleichtert die Entwicklung, Bereitstellung und Wartung von Anwendungen erheblich. CakePHP verfügt über eine Reihe von Bibliotheken, um die Überlastung der häufigsten Aufgaben zu reduzieren.

See all articles