दर सीमांकक
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 से कम, एकल मशीन और क्लस्टर दोनों में सटीक दर सीमांकन का समर्थन करता है -
अनुप्रयोग परिदृश्य
विकास वातावरण; ऑनलाइन एकल मशीन वातावरण; क्लस्टर वातावरण