রেট লিমিটার
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 এর চেয়ে নিম্ন কর্মক্ষমতা, একক মেশিনও ক্লাস্টার সঠিক রেট লিমিটিং সমর্থন করে। -
প্রযোজ্য দৃশ্যপট
ডেভেলপমেন্ট পরিবেশ; লাইভ একক মেশিন পরিবেশ; ক্লাস্টার পরিবেশ