Rate Limiting en PHP : protéger son API des surcharges et des bots

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Rate Limiting et Throttling en PHP : maîtrisez le flux de requêtes

\n\n

Imaginez : vous lancez une API géniale pour votre service. Tout fonctionne parfaitement, jusqu'à ce qu'un client « fou » commence à bombarder votre serveur avec des milliers de requêtes par seconde. Ou pire encore, un bot scraper décide d'aspirer toute votre base de données. Ça vous parle ? Si non, vous avez de la chance. Mais il vaut mieux être prêt. C'est là qu'entrent en scène le rate limiting et le throttling – deux chevaliers qui protégeront votre backend des surcharges.

\n\n

Dans cet article, nous allons voir comment implémenter la limitation de requêtes en PHP, examiner des exemples de code concrets et comprendre quelle méthode choisir pour votre projet. Spoiler : vous n'aurez pas à réinventer la roue, mais connaître les algorithmes de base est utile.

\n\n

Rate Limiting vs Throttling : quelle différence ?

\n\n

Ces termes sont souvent utilisés comme synonymes, mais il existe une nuance subtile entre eux.

\n\n
    \n
  • Rate Limiting – une limite stricte. Vous dites : « Maximum 100 requêtes par minute ». Une fois la limite atteinte, le client reçoit un HTTP 429 Too Many Requests et va boire un café.
  • \n
  • Throttling – un contrôle plus souple. Au lieu de bloquer, vous ralentissez simplement le traitement des requêtes au-delà de la limite, les mettez en file d'attente ou réduisez leur priorité.
  • \n
\n\n

En pratique, le throttling en PHP est souvent implémenté via des délais (sleep) ou des files d'attente, tandis que le rate limiting repose sur le comptage des requêtes par unité de temps. Pour la plupart des passerelles API, une combinaison des deux approches est optimale.

\n\n

Pourquoi c'est crucial pour votre projet ?

\n\n

Il y a au moins trois raisons d'implémenter la limitation de requêtes PHP :

\n\n
    \n
  • Protection contre les DDoS et les bots – même un simple script peut faire tomber un serveur si la fréquence des appels n'est pas contrôlée.
  • \n
  • Répartition équitable des ressources – un client « gourmand » ne doit pas priver les autres utilisateurs du service.
  • \n
  • Stabilité et prévisibilité – vous savez à quel pic de charge vous attendre et pouvez configurer votre infrastructure en conséquence.
  • \n
\n\n

Algorithmes de Rate Limiting : choisir sa stratégie

\n\n

Avant d'écrire du code, examinons trois algorithmes populaires. Chacun a ses avantages et ses inconvénients.

\n\n

1. Fixed Window (Fenêtre fixe)

\n

L'approche la plus simple. On divise le temps en segments (par exemple, par minutes). On mémorise le nombre de requêtes dans la fenêtre actuelle. Limite atteinte ? On bloque jusqu'à la fenêtre suivante.

\n\n

Inconvénient : aux limites des fenêtres, un pic est possible – un client peut envoyer 100 requêtes à la fin d'une minute et 100 autres au début de la suivante, soit 200 en 2 secondes.

\n\n

2. Sliding Window (Fenêtre glissante)

\n

Un algorithme plus précis. Au lieu de segments fixes, on examine les N dernières secondes. Les requêtes « vieillissent » et sortent de la fenêtre. Cela élimine les pics aux limites.

\n\n

3. Token Bucket (Seau de jetons)

\n

Un algorithme élégant issu du monde des réseaux. Un « seau » contient des jetons. Chaque requête consomme un jeton. Les jetons se régénèrent à une vitesse définie. Si le seau est vide, la requête est rejetée. Idéal pour le throttling php, car il permet de petits pics de trafic.

\n\n

Implémentation pratique : du simple au complexe

\n\n

Passons au code. Commençons par un exemple basique avec des fichiers, puis examinons des solutions industrielles.

\n\n

Rate Limiter basique avec fichiers (pour l'apprentissage)

\n\n

Cet exemple utilise des fichiers pour stocker les compteurs. Pas adapté à la production, mais il illustre parfaitement le principe.

\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

Book Recommendations