Heim  >  Artikel  >  Backend-Entwicklung  >  Umgang mit Anforderungsstrombegrenzung und Flusskontrolle in der PHP-Entwicklung

Umgang mit Anforderungsstrombegrenzung und Flusskontrolle in der PHP-Entwicklung

王林
王林Original
2023-10-09 09:57:031087Durchsuche

Umgang mit Anforderungsstrombegrenzung und Flusskontrolle in der PHP-Entwicklung

Der Umgang mit Anforderungsdrosselung und Flusskontrolle in der PHP-Entwicklung erfordert konkrete Codebeispiele

Da die Zahl der Internetnutzer weiter zunimmt, sind Websites und Anwendungen einem zunehmenden Verkehrsdruck ausgesetzt. Um die Stabilität und Leistung des Servers zu schützen, müssen wir den Anforderungsfluss begrenzen und den Fluss kontrollieren. In diesem Artikel wird erläutert, wie die Begrenzung des Anforderungsstroms und die Flusskontrolle in der PHP-Entwicklung gehandhabt werden, und es werden spezifische Codebeispiele bereitgestellt.

1. Anforderungsstrombegrenzung

Anforderungsstrombegrenzung bezieht sich auf die Begrenzung der Zugriffshäufigkeit, um zu verhindern, dass böswillige Anforderungen und viele gleichzeitige Anforderungen übermäßigen Druck auf den Server verursachen. Das Folgende ist ein Codebeispiel für die Begrenzung der PHP-Anforderungsrate basierend auf dem Token-Bucket-Algorithmus:

<?php
class RateLimiter {
    private $capacity; // 桶的容量
    private $rate; // 每秒产生的令牌数
    private $tokens; // 当前桶中的令牌数
    private $lastRefillTime; // 上次填充令牌的时间

    public function __construct($capacity, $rate) {
        $this->capacity = $capacity;
        $this->rate = $rate;
        $this->tokens = $capacity;
        $this->lastRefillTime = time();
    }

    public function allowRequest() {
        $currentTime = time();
        $this->tokens = min(
            $this->capacity,
            $this->tokens + ($currentTime - $this->lastRefillTime) * $this->rate
        );
        $this->lastRefillTime = $currentTime;

        if ($this->tokens < 1) {
            return false; // 桶中没有足够的令牌
        }

        $this->tokens--;
        return true; // 可以处理请求
    }
}

// 使用示例
$rateLimiter = new RateLimiter(10, 2); // 桶容量为10,每秒产生2个令牌
if ($rateLimiter->allowRequest()) {
    // 处理请求
    echo "处理请求";
} else {
    // 请求限流,返回错误信息
    echo "请求限流";
}
?>

Im obigen Code stellt die RateLimiter-Klasse einen Anforderungsratenbegrenzer dar, der die Bucket-Kapazität und die Anzahl der pro Sekunde generierten Token durch den festlegt Konstrukteur. Die Methode „allowRequest()“ wird verwendet, um zu bestimmen, ob die Anfrage verarbeitet werden kann. Wenn genügend Token im Bucket vorhanden sind, wird ein Token reduziert und „true“ zurückgegeben, andernfalls wird „false“ zurückgegeben, was darauf hinweist, dass die Anfrage flussbegrenzt ist.

2. Verkehrskontrolle

Verkehrskontrolle bezieht sich auf den Ausgleich von Serverlast und Benutzererfahrung durch Begrenzung der Zugriffsgeschwindigkeit jedes Benutzers. Das Folgende ist ein Codebeispiel für die PHP-Verkehrssteuerung basierend auf dem Token-Bucket-Algorithmus und dem Zähleralgorithmus:

<?php
class TrafficController {
    private $capacity; // 桶的容量
    private $rate; // 每秒产生的令牌数
    private $tokens; // 当前桶中的令牌数
    private $lastRefillTime; // 上次填充令牌的时间
    private $waitingRequests; // 等待的请求队列
    private $counters; // 用户访问计数器

    public function __construct($capacity, $rate) {
        $this->capacity = $capacity;
        $this->rate = $rate;
        $this->tokens = $capacity;
        $this->lastRefillTime = time();
        $this->waitingRequests = [];
        $this->counters = [];
    }

    public function allowRequest($userId) {
        $this->refillTokens();

        if ($this->tokens < 1 || $this->exceedsRateLimit($userId)) {
            $this->waitingRequests[$userId][] = time();
            return false; // 请求被限流
        }

        $this->tokens--;
        $this->counters[$userId]++;
        return true; // 可以处理请求
    }

    private function refillTokens() {
        $currentTime = time();
        $this->tokens = min(
            $this->capacity,
            $this->tokens + ($currentTime - $this->lastRefillTime) * $this->rate
        );
        $this->lastRefillTime = $currentTime;
    }

    private function exceedsRateLimit($userId) {
        $count = $this->counters[$userId] ?? 0;
        return $count >= $this->rate;
    }
}

// 使用示例
$trafficController = new TrafficController(10, 2); // 桶容量为10,每秒产生2个令牌

// 用户A发起请求
$userIdA = 1;
if ($trafficController->allowRequest($userIdA)) {
    // 处理请求
    echo "处理请求";
} else {
    // 请求被限流,返回错误信息
    echo "请求被限流";
}

// 用户B发起请求
$userIdB = 2;
if ($trafficController->allowRequest($userIdB)) {
    // 处理请求
    echo "处理请求";
} else {
    // 请求被限流,返回错误信息
    echo "请求被限流";
}
?>

Im obigen Code stellt die TrafficController-Klasse einen Verkehrscontroller dar, der die Bucket-Kapazität und die Anzahl der pro Sekunde generierten Token festlegt der Konstrukteur. Mit der Methode „allowRequest()“ wird ermittelt, ob die Anfrage verarbeitet werden kann und die Zugriffszahl des Benutzers das Limit nicht überschreitet. Reduzieren Sie die Zugriffszahl des Benutzers um ein Token Anforderung an die Warteschlange und die Rückgabe von „false“ zeigt an, dass die Anforderung durchflussbegrenzt ist.

Zusammenfassung

Dieser Artikel stellt den Umgang mit Anforderungsdrosselung und Flusskontrolle in der PHP-Entwicklung vor und stellt spezifische Codebeispiele bereit. Anforderungsstrombegrenzung und Flusskontrolle sind wichtige Mittel zum Schutz der Serverstabilität und -leistung. In tatsächlichen Projekten können Entwickler je nach Bedarf geeignete Algorithmen und Parameter für die Konfiguration auswählen. Bitte beachten Sie, dass in einer tatsächlichen Produktionsumgebung ein umfassender Schutz mit anderen Schutzmaßnahmen und der Serverkonfiguration kombiniert werden muss.

Das obige ist der detaillierte Inhalt vonUmgang mit Anforderungsstrombegrenzung und Flusskontrolle in der PHP-Entwicklung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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