Rate Limiting in PHP: Vollständiger Leitfaden zur Anfragenbegrenzung

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Rate Limiting in PHP: API-Schutz und Lastoptimierung

\n

Rate Limiting (Anfragenbegrenzung) ist ein kritisch wichtiger Mechanismus für jede Webanwendung in PHP, insbesondere für öffentliche APIs. Es verhindert Missbrauch, schützt vor DDoS-Angriffen, reduziert die Serverlast und gewährleistet eine faire Ressourcenverteilung zwischen Benutzern. In diesem Artikel werden wir die gängigen Bibliotheken und Werkzeuge zur Implementierung von Rate Limiting in PHP im Detail besprechen.

\n\n

Grundlegende Rate-Limiting-Algorithmen

\n

Bevor Sie eine Bibliothek auswählen, ist es wichtig, die grundlegenden Algorithmen zu verstehen:

\n
    \n
  • Token Bucket (Token-Eimer) — der flexibelste Algorithmus. Der Eimer enthält N Token, jede Anfrage entnimmt einen Token. Token werden mit einer festgelegten Rate wieder aufgefüllt.
  • \n
  • Leaky Bucket (Undichter Eimer) — Anfragen werden mit konstanter Geschwindigkeit verarbeitet. Überschüssige Anfragen werden verworfen oder in eine Warteschlange gestellt.
  • \n
  • Fixed Window (Festes Fenster) — Anfragen werden innerhalb eines festen Intervalls (z. B. 60 Sekunden) gezählt. Einfach, kann aber Spitzenlasten an Fenstergrenzen durchlassen.
  • \n
  • Sliding Window (Gleitendes Fenster) — ein präziserer Algorithmus, der Anfragen in einem gleitenden Zeitfenster berücksichtigt. Verwendet Logs oder Zähler mit Zeitstempeln.
  • \n
\n\n

Beliebte Bibliotheken für Rate Limiting in PHP

\n\n

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

\n

Offizielle Symfony-Komponente, funktioniert aber auch als Standalone-Bibliothek. Unterstützt alle wichtigen Algorithmen: Token Bucket, Fixed Window, Sliding Window. Ideal für Projekte mit Symfony oder Laravel.

\n
use Symfony\\Component\\RateLimiter\\RateLimiterFactory;\nuse Symfony\\Component\\RateLimiter\\Storage\\InMemoryStorage;\n\n$factory = new RateLimiterFactory([\n    'id' => 'api',\n    'policy' => 'token_bucket',\n    'limit' => 100,\n    'rate' => ['interval' => '1 minute'],\n], new InMemoryStorage());\n\n$limiter = $factory->create('user_123');\n\nif ($limiter->consume(1)->isAccepted()) {\n    // Anfrage verarbeiten\n} else {\n    // Rückgabe 429 Too Many Requests\n    header('HTTP/1.1 429 Too Many Requests');\n    echo json_encode(['error' => 'Rate limit exceeded']);\n}
\n\n

2. nikic/FastRoute mit Middleware Rate Limiting

\n

Leichtgewichtige Lösung für Projekte ohne Frameworks. Verwendet eine PHP-Implementierung von Token Bucket mit Speicherung in Redis oder Memcached.

\n
class RateLimitMiddleware {\n    private $redis;\n    private $maxRequests = 100;\n    private $window = 60; // Sekunden\n\n    public function handle($request, $next) {\n        $key = 'rate_limit:' . $_SERVER['REMOTE_ADDR'];\n        $current = $this->redis->incr($key);\n        \n        if ($current === 1) {\n            $this->redis->expire($key, $this->window);\n        }\n\n        if ($current > $this->maxRequests) {\n            return new Response('Too Many Requests', 429);\n        }\n\n        return $next($request);\n    }\n}
\n\n

3. Laravel Rate Limiter (integriert)

\n

In Laravel ist Rate Limiting in den Kern integriert. Verwendet Redis oder Cache. Unterstützt benannte Limiter und Segmentierung nach Benutzern.

\n
// In RouteServiceProvider\nuse Illuminate\\Cache\\RateLimiting\\Limit;\nuse Illuminate\\Http\\Request;\n\nprotected function configureRateLimiting()\n{\n    RateLimiter::for('api', function (Request $request) {\n        return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());\n    });\n}\n\n// Im Controller\npublic function index()\n{\n    $executed = RateLimiter::attempt(\n        'send-message:'.$user->id,\n        $perMinute = 5,\n        function() {\n            // Nachricht senden\n        }\n    );\n    \n    if (! $executed) {\n        return response('Too Many Attempts.', 429);\n    }\n}
\n\n

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

\n

Universelle

Empfehlungen