दर सीमांकक

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, उपयोगकर्ता ID के आयाम पर दर सीमांकित करना, अपेक्षा है कि session('user.id') खाली न हो
        return 'प्रत्येक उपयोगकर्ता 60 सेकंड में अधिकतम 100 खोजें कर सकता है';
    }

    #[RateLimiter(limit: 1, ttl: 60, key: RateLimiter::SID, message: 'प्रत्येक व्यक्ति प्रति मिनट केवल एक बार ईमेल भेज सकता है')]
    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: 'प्रत्येक उपयोगकर्ता प्रति दिन केवल एक कूपन प्राप्त कर सकता है')]
    public function coupon(): string
    {
        // key: 'coupon', यहाँ coupon एक कस्टम key है, अर्थात् वैश्विक स्तर पर coupon के रूप में दर सीमांकित करना, प्रति दिन अधिकतम 100 कूपन भेजे जा सकते हैं
        // साथ ही उपयोगकर्ता ID के आयाम पर दर सीमांकित करना, प्रत्येक उपयोगकर्ता प्रति दिन केवल एक कूपन प्राप्त कर सकता है
        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 के अनुरोधों पर कोई गति सीमा लागू नहीं होती (केवल तब कार्यात्मक जब key RateLimiter::IP हो)
    '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 का स्थान खोज सकते हैं

  • परिचय
    प्रदर्शन memory के मुकाबले थोड़ी कम है, बहु-प्रक्रिया साझा दर सीमांकन डेटा का समर्थन करता है।

  • उपयोग में प्रतिबंध
    क्लस्टर का समर्थन नहीं करता है

  • अनुप्रयोग परिदृश्य
    कोई भी विकास वातावरण; ऑनलाइन एकल मशीन पर दर सीमांकन परिदृश्य; क्लस्टर जिसमें सख्त दर सीमांकन की आवश्यकता नहीं है; CC हमलों से बचाव।

redis

  • निर्भरता
    redis एक्सटेंशन स्थापित करने की आवश्यकता है, और Redis घटक स्थापित करें, स्थापना आदेश

    composer require -W illuminate/redis illuminate/events
  • परिचय
    प्रदर्शन apcu से कम, एकल मशीन और क्लस्टर दोनों में सटीक दर सीमांकन का समर्थन करता है

  • अनुप्रयोग परिदृश्य
    विकास वातावरण; ऑनलाइन एकल मशीन वातावरण; क्लस्टर वातावरण