Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara mengendalikan permintaan pengehadan semasa dan kawalan aliran dalam pembangunan PHP

Cara mengendalikan permintaan pengehadan semasa dan kawalan aliran dalam pembangunan PHP

王林
王林asal
2023-10-09 09:57:031059semak imbas

Cara mengendalikan permintaan pengehadan semasa dan kawalan aliran dalam pembangunan PHP

Cara mengendalikan pendikit permintaan dan kawalan aliran dalam pembangunan PHP memerlukan contoh kod khusus

Memandangkan bilangan pengguna Internet terus meningkat, tapak web dan aplikasi menghadapi tekanan trafik yang semakin meningkat. Untuk melindungi kestabilan dan prestasi pelayan, kami perlu mengehadkan aliran permintaan dan mengawal aliran. Artikel ini akan memperkenalkan cara mengendalikan permintaan pengehadan semasa dan kawalan aliran dalam pembangunan PHP, dan menyediakan contoh kod khusus.

1. Permintaan pengehadan semasa

Permintaan pengehadan semasa merujuk kepada mengehadkan kekerapan akses untuk mengelakkan permintaan berniat jahat dan permintaan serentak yang tinggi daripada menyebabkan tekanan yang berlebihan pada pelayan. Berikut ialah contoh kod pengehadan kadar permintaan PHP berdasarkan algoritma baldi token:

<?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 "请求限流";
}
?>

Dalam kod di atas, kelas RateLimiter mewakili pengehad kadar permintaan, yang menetapkan kapasiti baldi dan bilangan token yang dijana sesaat melalui pembina. Kaedah allowRequest() digunakan untuk menentukan sama ada permintaan boleh diproses Jika terdapat cukup token dalam baldi, ia akan mengurangkan satu token dan mengembalikan benar jika tidak, ia akan mengembalikan palsu, menunjukkan bahawa permintaan adalah terhad.

2. Kawalan Trafik

Kawalan trafik merujuk kepada mengimbangi beban pelayan dan pengalaman pengguna dengan mengehadkan kelajuan akses setiap pengguna. Berikut ialah contoh kod kawalan trafik PHP berdasarkan algoritma baldi token dan algoritma balas:

<?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 "请求被限流";
}
?>

Dalam kod di atas, kelas TrafficController mewakili pengawal trafik, yang menetapkan kapasiti baldi dan bilangan token yang dijana sesaat melalui pembina. Kaedah allowRequest() digunakan untuk menentukan sama ada permintaan boleh diproses Jika terdapat cukup token dalam baldi dan kiraan akses pengguna tidak melebihi had, kemudian kurangkan satu token dan tambahkan bilangan akses pengguna permintaan kepada baris gilir menunggu dan Mengembalikan palsu menunjukkan bahawa permintaan adalah terhad aliran.

Ringkasan

Artikel ini memperkenalkan cara mengendalikan pendikitan permintaan dan kawalan aliran dalam pembangunan PHP dan menyediakan contoh kod khusus. Permintaan pengehadan semasa dan kawalan aliran adalah cara penting untuk melindungi kestabilan dan prestasi pelayan Dalam projek sebenar, pembangun boleh memilih algoritma dan parameter yang sesuai untuk konfigurasi mengikut keperluan. Sila ambil perhatian bahawa dalam persekitaran pengeluaran sebenar, perlindungan menyeluruh perlu digabungkan dengan langkah perlindungan dan konfigurasi pelayan lain.

Atas ialah kandungan terperinci Cara mengendalikan permintaan pengehadan semasa dan kawalan aliran dalam pembangunan PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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