PHP में Rate Limiting: अनुरोध सीमित करने की पूरी गाइड

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

PHP में Rate Limiting: API सुरक्षा और लोड ऑप्टिमाइज़ेशन

Rate limiting (अनुरोध गति सीमित करना) किसी भी PHP वेब एप्लिकेशन, खासकर सार्वजनिक API के लिए एक महत्वपूर्ण तंत्र है। यह दुरुपयोग को रोकता है, DDoS हमलों से बचाता है, सर्वर लोड कम करता है, और उपयोगकर्ताओं के बीच संसाधनों का उचित वितरण सुनिश्चित करता है। इस लेख में, हम PHP में rate limiting लागू करने के लिए लोकप्रिय लाइब्रेरी और टूल्स पर विस्तार से चर्चा करेंगे।

Rate Limiting के मुख्य एल्गोरिदम

लाइब्रेरी चुनने से पहले, बुनियादी एल्गोरिदम को समझना ज़रूरी है:

  • Token Bucket (टोकन बकेट) — सबसे लचीला एल्गोरिदम। बकेट में N टोकन होते हैं, हर अनुरोध एक टोकन लेता है। टोकन एक निश्चित दर पर रिफिल होते हैं।
  • Leaky Bucket (लीकी बकेट) — अनुरोध एक स्थिर गति से प्रोसेस होते हैं। अतिरिक्त अनुरोधों को छोड़ दिया जाता है या कतार में लगा दिया जाता है।
  • Fixed Window (फिक्स्ड विंडो) — अनुरोध एक निश्चित अंतराल (जैसे, 60 सेकंड) में गिने जाते हैं। सरल है, लेकिन विंडो की सीमाओं पर पीक लोड को पास कर सकता है।
  • Sliding Window (स्लाइडिंग विंडो) — अधिक सटीक एल्गोरिदम, जो फ्लोटिंग टाइम विंडो में अनुरोधों को ध्यान में रखता है। यह लॉग या टाइमस्टैम्प वाले काउंटर का उपयोग करता है।

PHP में Rate Limiting के लिए लोकप्रिय लाइब्रेरी

1. Symfony Rate Limiter (symfony/rate-limiter)

Symfony का आधिकारिक कंपोनेंट, लेकिन यह एक स्टैंडअलोन लाइब्रेरी के रूप में भी काम करता है। यह सभी मुख्य एल्गोरिदम को सपोर्ट करता है: Token Bucket, Fixed Window, Sliding Window। यह Symfony या Laravel प्रोजेक्ट्स के लिए आदर्श है।

use Symfony\Component\RateLimiter\RateLimiterFactory;
use Symfony\Component\RateLimiter\Storage\InMemoryStorage;

$factory = new RateLimiterFactory([
    'id' => 'api',
    'policy' => 'token_bucket',
    'limit' => 100,
    'rate' => ['interval' => '1 minute'],
], new InMemoryStorage());

$limiter = $factory->create('user_123');

if ($limiter->consume(1)->isAccepted()) {
    // अनुरोध प्रोसेस करें
} else {
    // 429 Too Many Requests भेजें
    header('HTTP/1.1 429 Too Many Requests');
    echo json_encode(['error' => 'Rate limit exceeded']);
}

2. nikic/FastRoute के साथ middleware rate limiting

फ्रेमवर्क के बिना प्रोजेक्ट्स के लिए हल्का समाधान। यह Redis या Memcached में स्टोरेज के साथ Token Bucket की PHP इम्प्लीमेंटेशन का उपयोग करता है।

class RateLimitMiddleware {
    private $redis;
    private $maxRequests = 100;
    private $window = 60; // सेकंड

    public function handle($request, $next) {
        $key = 'rate_limit:' . $_SERVER['REMOTE_ADDR'];
        $current = $this->redis->incr($key);
        
        if ($current === 1) {
            $this->redis->expire($key, $this->window);
        }

        if ($current > $this->maxRequests) {
            return new Response('Too Many Requests', 429);
        }

        return $next($request);
    }
}

3. Laravel Rate Limiter (बिल्ट-इन)

Laravel में rate limiting कोर में बिल्ट-इन है। यह Redis या कैश का उपयोग करता है। यह नामित लिमिटर्स और उपयोगकर्ताओं के अनुसार सेगमेंटेशन को सपोर्ट करता है।

// RouteServiceProvider में
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Http\Request;

protected function configureRateLimiting()
{
    RateLimiter::for('api', function (Request $request) {
        return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
    });
}

// कंट्रोलर में
public function index()
{
    $executed = RateLimiter::attempt(
        'send-message:'.$user->id,
        $perMinute = 5,
        function() {
            // मैसेज भेजें
        }
    );
    
    if (! $executed) {
        return response('Too Many Attempts.', 429);
    }
}

4. PHP RateLimit (php-rateLimit/php-rateLimit)

एक सार्वभौमिक लाइब्रेरी जो कई बैकएंड को सपोर्ट करती है: फ़ाइलें, Redis, PDO, APCu। यह Sliding Window एल्गोरिदम को लागू करती है।

अनुशंसाएँ