রেট লিমিটার

Webman রেট লিমিটার, অ্যানোটেশন রেট লিমিটিং সমর্থন করে।
এটি apcu, redis, memory ড্রাইভার সমর্থন করে।

সোর্স কোড ঠিকানা

https://github.com/webman-php/rate-limiter

ইনস্টলেশন

composer require webman/rate-limiter

ব্যবহার

<?php
namespace app\controller;

use RuntimeException;
use Webman\RateLimiter\Annotation\RateLimiter;

class UserController
{

    #[RateLimiter(limit: 10)]
    public function index(): string
    {
        // ডিফল্টরূপে IP রেট লিমিটিং, ডিফল্ট ইউনিট সময় 1 সেকেন্ড
        return 'প্রতিটি ip প্রতি সেকেন্ডে সর্বাধিক 10টি অনুরোধ';
    }

    #[RateLimiter(limit: 100, ttl: 60, key: RateLimiter::UID)]
    public function search(): string
    {
        // key: RateLimiter::UID, ব্যবহারকারী আইডি দ্বারা রেট লিমিটিং করা হবে, session('user.id') খালি হওয়া উচিত নয়
        return 'প্রতিটি ব্যবহারকারী প্রতি 60 সেকেন্ডে সর্বাধিক 100টি অনুসন্ধান';
    }

    #[RateLimiter(limit: 1, ttl: 60, key: RateLimiter::SID, message: 'প্রত্যেক ব্যক্তির প্রতি মিনিটে শুধুমাত্র 1টি ইমেইল পাঠাতে পারবেন')]
    public function sendMail(): string
    {
        // key: RateLimiter::SID, session_id দ্বারা রেট লিমিটিং করা হয়
        return 'ইমেইল সফলভাবে পাঠানো হয়েছে';
    }

    #[RateLimiter(limit: 100, ttl: 24*60*60, key: 'coupon', message: 'আজকের কুপনগুলো শেষ হয়েছে, দয়া করে আগামীকাল আসবেন')]
    #[RateLimiter(limit: 1, ttl: 24*60*60, key: RateLimiter::UID, message: 'প্রতিটি ব্যবহারকারী প্রতি দিন শুধুমাত্র 1টি কুপন পেতে পারেন')]
    public function coupon(): string
    {
        // key: 'coupon', এখানে coupon একটি কাস্টম key, অর্থাৎ গ্লোবালভাবে coupon key দ্বারা রেট লিমিটিং করা হবে, প্রতি দিনে সর্বাধিক 100টি কুপন প্রদান
        // একই সময়ে ব্যবহারকারী আইডি দ্বারা রেট লিমিটিং করা হবে, প্রতিটি ব্যবহারকারী প্রতি দিন শুধুমাত্র 1টি কুপন পেতে পারে
        return 'কুপন সফলভাবে পাঠানো হয়েছে';
    }

    #[RateLimiter(limit: 5, ttl: 24*60*60, key: [UserController::class, 'getMobile'], message: 'প্রতিটি মোবাইল নম্বরকে দিনে সর্বাধিক 5টি এসএমএস পাঠানো যাবে')]
    public function sendSms2(): string
    {
        // যখন key একটি ভেরিয়েবল হয়, এটি [ক্লাস, স্ট্যাটিক মেথড] পদ্ধতিতে key পাওয়া যেতে পারে, যেমন [UserController::class, 'getMobile'] UserController-এর getMobile() মেথডকে কল করবে এবং তার ফলাফলকে key হিসাবে ব্যবহার করবে
        return 'এসএমএস সফলভাবে পাঠানো হয়েছে';
    }

    /**
     * কাস্টম key, মোবাইল নম্বর পাওয়া, এটি একটি স্ট্যাটিক মেথড হতে হবে
     * @return string
     */
    public static function getMobile(): string
    {
        return request()->get('mobile');
    }

    #[RateLimiter(limit: 1, ttl: 10, key: RateLimiter::IP, message: 'ফ্রিকোয়েন্সি সীমিত', exception: RuntimeException::class)]
    public function testException(): string
    {
        // সীমা লঙ্ঘনের জন্য ডিফল্ট ব্যতিক্রম হল Webman\RateLimiter\RateLimitException, exception প্যারামিটার দ্বারা পরিবর্তন করা যায়
        return 'ok';
    }

}

স্পষ্টকরণ

  • ডিফল্ট ইউনিট সময়ের ব্যবধান 1 সেকেন্ড
  • ttl দ্বারা ইউনিট সময়ের ব্যবধান সেট করা যায়, উদাহরণস্বরূপ ttl:60 মানে 60 সেকেন্ড
  • ডিফল্ট রেট লিমিটিং মাত্রা হল IP রেট লিমিটিং (ডিফল্ট 127.0.0.1 রেট লিমিটিং মুক্ত, নীচে কনফিগারেশন অংশ দেখুন)
  • বিল্ট-ইন IP রেট লিমিটিং,UID রেট লিমিটিং (যার জন্য session('user.id') খালি হওয়া উচিত নয়), SID রেট লিমিটিং (session_id অনুসারে রেট লিমিটিং)
  • যদি nginx প্রক্সি ব্যবহার করা হয়, তবে IP রেট লিমিটিংয়ের সময় X-Forwarded-For শিরোনামটি প্রেরণ করতে হবে, nginx প্রক্সি দেখুন
  • সীমা ছাড়িয়ে গেলে Webman\RateLimiter\RateLimitException ব্যতিক্রম তৈরি হবে, exception:xx দ্বারা কাস্টম ব্যতিক্রম শ্রেণী পরিবর্তন করা যায়
  • সীমা ছাড়ানোর সময় ব্যতিক্রম তৈরি হলে, ডিফল্ট ত্রুটি বার্তা হল Too Many Requests, message:xx দ্বারা কাস্টম ত্রুটি বার্তা পরিবর্তন করা যায়
  • ডিফল্ট ত্রুটি বার্তা বহুভাষী দ্বারা পরিবর্তন করা যেতে পারে, Linux-এর জন্য নিচের কমান্ড অনুসরণ করুন
    composer require symfony/translation
    mkdir resource/translations/zh_CN/ -p
    echo "<?php
    return [
    'Too Many Requests' => 'অনুরোধের হার সীমাবদ্ধ'
    ];" > resource/translations/zh_CN/messages.php
    php start.php restart

ইন্টারফেস

কখনও কখনও ডেভেলপাররা কোডে সরাসরি রেট লিমিটার কল করতে চান, নিচের কোডটি দেখুন

<?php
namespace app\controller;

use RuntimeException;
use Webman\RateLimiter\Limiter;

class UserController {

    public function sendSms(string $mobile): string
    {
        // এখানে mobile key হিসেবে কাজ করছে
        Limiter::check($mobile, 5, 24*60*60, 'প্রতিটি মোবাইল নম্বরকে দিনে সর্বাধিক 5টি এসএমএস পাঠানো যাবে');
        return 'এসএমএস সফলভাবে পাঠানো হয়েছে';
    }
}

কনফিগারেশন

config/plugin/webman/rate-limiter/app.php

<?php
return [
    'enable' => true,
    'driver' => 'auto', // auto, apcu, memory, redis
    'stores' => [
        'redis' => [
            'connection' => 'default',
        ]
    ],
    // এই ipগুলির অনুরোধগুলির উপর ফ্রিকোয়েন্সি সীমাবদ্ধ নয় (শুধুমাত্র RateLimiter::IP হিসাবে key হলে কার্যকর)
    'ip_whitelist' => [
        '127.0.0.1',
    ],
];
  • enable: রেট লিমিটার চালু করা হয়েছে কি না
  • driver: auto apcu memory redis মধ্যে একটি মান, auto ব্যবহার করলে এটি স্বয়ংক্রিয়ভাবে apcu এবং memory মধ্যে একটি মান নির্বাচন করবে
  • stores: redis কনফিগারেশন, connection নির্দেশ করে config/redis.php এর সাথে সম্পর্কিত key
  • ip_whitelist: সাদা তালিকার ip রেট লিমিটিং মুক্ত থাকবে (শুধুমাত্র key RateLimiter::IP হলে কার্যকর)

ড্রাইভার নির্বাচন

memory

  • পরিচিতি
    কোন এক্সটেনশন ইনস্টল করার প্রয়োজন নেই, সেরা কর্মক্ষমতা।

  • ব্যবহারের সীমা
    রেট লিমিটিং শুধুমাত্র বর্তমান প্রক্রিয়ার জন্য কার্যকর, একাধিক প্রক্রিয়ার মধ্যে রেট লিমিটিং তথ্য ভাগ করা হয় না, এবং ক্লাস্টার রেট লিমিটিং সমর্থন করে না।

  • প্রযোজ্য দৃশ্যপট
    উইন্ডোজ ডেভেলপমেন্ট পরিবেশ; কঠোর রেট লিমিটিংয়ের প্রয়োজন নয় তাৎক্ষণিক ব্যবসা; CC আক্রমণের বিরুদ্ধে।

apcu

  • এক্সটেনশন ইনস্টল
    apcu এক্সটেনশন ইনস্টল করা প্রয়োজন এবং php.ini তে সেট করতে হবে

    apc.enabled=1
    apc.enable_cli=1

    যদি php.ini অবস্থান জানা না থাকে, তবে php --ini কমান্ড দ্বারা php.ini অবস্থান খুঁজে বের করুন

  • পরিচিতি
    মেমরি থেকে কিছুটা কম কর্মক্ষমতা, বহু প্রক্রিয়া রেট লিমিটিং তথ্য ভাগ করতে সমর্থন করে।

  • ব্যবহারের সীমা
    ক্লাস্টার সমর্থন করে না

  • প্রযোজ্য দৃশ্যপট
    যে কোনও ডেভেলপমেন্ট পরিবেশ; লাইভ সিঙ্গেল-মেশিন রেট লিমিটিং দৃশ্যপট; ক্লাস্টারগুলির জন্য কঠোর রেট লিমিটিংয়ের প্রয়োজন নেই; CC আক্রমণের বিরুদ্ধে।

redis

  • নির্ভরতাগুলি
    redis এক্সটেনশন ইনস্টল করতে হয় এবং Redis উপাদানটি ইনস্টল করতে হয়, ইনস্টলেশন কমান্ড

    composer require -W illuminate/redis illuminate/events
  • পরিচিতি
    apcu এর চেয়ে নিম্ন কর্মক্ষমতা, একক মেশিনও ক্লাস্টার সঠিক রেট লিমিটিং সমর্থন করে।

  • প্রযোজ্য দৃশ্যপট
    ডেভেলপমেন্ট পরিবেশ; লাইভ একক মেশিন পরিবেশ; ক্লাস্টার পরিবেশ