Rate Limiting in PHP: API vor Überlastung und Bots schützen

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 und Throttling in PHP: Den Anfragenstrom kontrollieren

\n\n

Stellen Sie sich vor: Sie haben eine tolle API für Ihren Dienst gestartet. Alles läuft perfekt, bis ein „verrückter“ Client Ihren Server mit Tausenden von Anfragen pro Sekunde bombardiert. Oder noch schlimmer: Ein Bot-Parser beschließt, Ihre gesamte Datenbank herunterzuladen. Kommt Ihnen bekannt vor? Wenn nicht – haben Sie Glück. Aber es ist besser, vorbereitet zu sein. Genau hier kommen Rate Limiting und Throttling ins Spiel – zwei Ritter, die Ihr Backend vor Überlastung schützen.

\n\n

In diesem Artikel erfahren Sie, wie Sie Anfragen in PHP begrenzen, sehen praktische Codebeispiele und verstehen, welche Methode für Ihr Projekt am besten geeignet ist. Spoiler: Sie müssen das Rad nicht neu erfinden, aber die grundlegenden Algorithmen zu kennen, ist hilfreich.

\n\n

Rate Limiting vs. Throttling: Was ist der Unterschied?

\n\n

Oft werden diese Begriffe synonym verwendet, aber es gibt einen feinen Unterschied.

\n\n
    \n
  • Rate Limiting – ein hartes Limit. Sie sagen: „Maximal 100 Anfragen pro Minute“. Sobald das Limit erreicht ist, erhält der Client HTTP 429 Too Many Requests und muss warten.
  • \n
  • Throttling – eine weichere Kontrolle. Statt einer Blockade verlangsamen Sie die Verarbeitung von Anfragen über dem Limit, stellen sie in eine Warteschlange oder senken die Priorität.
  • \n
\n\n

In der Praxis wird Throttling in PHP oft durch Verzögerungen (sleep) oder Warteschlangen realisiert, während Rate Limiting auf der Zählung von Anfragen pro Zeiteinheit basiert. Für die meisten API-Gateways ist eine Kombination beider Ansätze optimal.

\n\n

Warum ist das für Ihr Projekt entscheidend?

\n\n

Es gibt mindestens drei Gründe, Anfragen in PHP zu limitieren:

\n\n
    \n
  • Schutz vor DDoS und Bots – selbst ein einfaches Skript kann Ihren Server lahmlegen, wenn die Aufruffrequenz nicht kontrolliert wird.
  • \n
  • Faire Ressourcenverteilung – ein „gieriger“ Client sollte nicht die anderen Nutzer Ihres Dienstes beeinträchtigen.
  • \n
  • Stabilität und Vorhersagbarkeit – Sie wissen, welche Spitzenlasten zu erwarten sind, und können Ihre Infrastruktur entsprechend anpassen.
  • \n
\n\n

Rate-Limiting-Algorithmen: Die richtige Strategie wählen

\n\n

Bevor wir Code schreiben, betrachten wir drei gängige Algorithmen. Jeder hat seine Vor- und Nachteile.

\n\n

1. Fixed Window (Festes Fenster)

\n

Der einfachste Ansatz. Die Zeit wird in Abschnitte unterteilt (z. B. Minuten). Es wird gezählt, wie viele Anfragen im aktuellen Fenster eingehen. Ist das Limit erreicht, wird bis zum nächsten Fenster blockiert.

\n\n

Nachteil: An den Fenstergrenzen kann es zu Spitzen kommen – ein Client könnte 100 Anfragen am Ende einer Minute und weitere 100 zu Beginn der nächsten senden, also 200 in zwei Sekunden.

\n\n

2. Sliding Window (Gleitendes Fenster)

\n

Ein präziserer Algorithmus. Statt fester Abschnitte werden die letzten N Sekunden betrachtet. Anfragen „altern“ und fallen aus dem Fenster. Dadurch werden Spitzen an den Grenzen vermieden.

\n\n

3. Token Bucket (Token-Eimer)

\n

Ein eleganter Algorithmus aus der Netzwerkwelt. In einem „Eimer“ liegen Token. Jede Anfrage nimmt einen Token. Token werden mit einer festgelegten Rate nachgefüllt. Ist der Eimer leer, wird die Anfrage abgelehnt. Ideal für Throttling in PHP, da es kleine Traffic-Spitzen erlaubt.

\n\n

Praktische Umsetzung: Vom Einfachen zum Komplexen

\n\n

Kommen wir zum Code. Wir beginnen mit einem einfachen Beispiel auf Dateibasis und sehen uns dann produktionsreife Lösungen an.

\n\n

Einfacher Rate Limiter mit Dateien (für Lernzwecke)

\n\n

Dieses Beispiel verwendet Dateien zum Speichern von Zählern. Nicht für die Produktion geeignet, aber es veranschaulicht das Prinzip hervorragend.

\n\n
<?php\nclass SimpleRateLimiter {\n    private string $storageDir;\n    private int $maxRequests;\n    private int $windowSeconds;\n\n    public function __construct(string $storageDir, int $maxRequests = 100, int $windowSeconds = 60) {\n        $this->storageDir = rtrim($storageDir, '/') . '/';\n        $this->maxRequests = $maxRequests;\n        $this->windowSeconds =                

Blogs

Buchempfehlungen