Rate Limiting en PHP : guide complet sur la limitation des requêtes

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 en PHP : protection des API et optimisation de la charge

\n

Le rate limiting (limitation du taux de requêtes) est un mécanisme crucial pour toute application web en PHP, en particulier pour les API publiques. Il prévient les abus, protège contre les attaques DDoS, réduit la charge sur le serveur et assure une répartition équitable des ressources entre les utilisateurs. Dans cet article, nous allons détailler les bibliothèques et outils populaires pour implémenter le rate limiting en PHP.

\n\n

Algorithmes principaux du rate limiting

\n

Avant de choisir une bibliothèque, il est important de comprendre les algorithmes de base :

\n
    \n
  • Token Bucket (Seau à jetons) — l'algorithme le plus flexible. Le seau contient N jetons, chaque requête consomme un jeton. Les jetons se reconstituent à une vitesse définie.
  • \n
  • Leaky Bucket (Seau percé) — les requêtes sont traitées à une vitesse constante. Les requêtes excédentaires sont rejetées ou mises en file d'attente.
  • \n
  • Fixed Window (Fenêtre fixe) — les requêtes sont comptabilisées sur un intervalle fixe (ex. 60 secondes). Simple, mais peut laisser passer des pics de charge aux limites des fenêtres.
  • \n
  • Sliding Window (Fenêtre glissante) — un algorithme plus précis qui prend en compte les requêtes dans une fenêtre temporelle flottante. Utilise des logs ou des compteurs avec des horodatages.
  • \n
\n\n

Bibliothèques populaires pour le rate limiting en PHP

\n\n

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

\n

Composant officiel de Symfony, mais fonctionne également comme bibliothèque autonome. Prend en charge tous les algorithmes principaux : Token Bucket, Fixed Window, Sliding Window. Idéal pour les projets sous Symfony ou 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    // Traitement de la requête\n} else {\n    // Retour 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 avec middleware rate limiting

\n

Solution légère pour les projets sans framework. Utilise une implémentation PHP de Token Bucket avec stockage dans Redis ou Memcached.

\n
class RateLimitMiddleware {\n    private $redis;\n    private $maxRequests = 100;\n    private $window = 60; // secondes\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 (intégré)

\n

Dans Laravel, le rate limiting est intégré au noyau. Utilise Redis ou le cache. Prend en charge les limiteurs nommés et le segmentation par utilisateur.

\n
// Dans 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// Dans le contrôleur\npublic function index()\n{\n    $executed = RateLimiter::attempt(\n        'send-message:'.$user->id,\n        $perMinute = 5,\n        function() {\n            // Envoi du message\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

Bibliothèque universelle

Recommendations