Rate Limiting in PHP: Limiting Request Frequency for Site Protection

Online Python Trainer for Beginners

Learn Python easily without overwhelming theory. Solve practical tasks with automatic checking, get hints in Russian, and write code directly in your browser — no installation required.

Start Course

Rate Limiting in PHP: A Complete Guide to Overload Protection



Rate Limiting is a critically important mechanism for protecting web applications. It prevents abuse of server resources, protects against DDoS attacks, password brute force, and spam. In PHP, there are several effective approaches and libraries for implementing rate limiting. In this article, we will look at the best tools, operating principles, and practical examples.



What is Rate Limiting and Why is it Needed?

Rate Limiting sets the maximum number of requests that a client (IP address, user, or API key) can make within a certain period of time. Main goals:

  • DDoS Protection — preventing server overload by bots
  • Brute Force Prevention — limiting login attempts
  • Fair Resource Distribution — equal access for all users
  • Server Resource Savings — reducing load on the database and processor


Popular Rate Limiting Algorithms

Before choosing a library, it is important to understand the basic algorithms:

  • Token Bucket — accumulates tokens at a certain rate, allows short traffic bursts
  • Leaky Bucket — smooths traffic by processing requests at a constant rate
  • Fixed Window — counts requests over a fixed time interval
  • Sliding Window — a more accurate variant that considers requests in a sliding time window


Best Libraries for Rate Limiting in PHP



1. Symfony Rate Limiter

An official Symfony component that can be used independently of the framework. Supports Redis, APCu, and file storage.

composer require symfony/rate-limiter

Usage example:

<?phpuse Symfony\\Component\\RateLimiter\\RateLimiterFactory;use Symfony\\Component\\RateLimiter\\Storage\\InMemoryStorage;

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

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

if ($limiter->consume()->isAccepted()) { // Allow the request echo "Access granted";} else { // Reject the request http_response_code(429); echo "Too many requests";}?>


2. PHP RateLimiter (by bantu)

A lightweight library for simple scenarios. Supports Redis, Memcached, and files.

composer require bantu/php-ratelimiter

Example:

<?phpuse bantu\\RateLimiter\\RateLimiterFactory;

$factory = new RateLimiterFactory();$limiter = $factory->createRedisRateLimiter( new \\Predis\\Client(), 'api_limit', 100, // request limit 3600 // window in seconds);

if ($limiter->hit($_SERVER['REMOTE_ADDR'])) { echo "Request accepted";} else { http_response_code(429); echo "Limit exhausted";}?>


3. GrahamCampbell/Laravel RateLimiter

If you work with Laravel, this is a native solution. Built into the framework starting from version 8.

<?phpuse Illuminate\\Support\\Facades\\RateLimiter;

// Defining the limiter in AppServiceProviderRateLimiter::for('api', function ($job) { return \\Illuminate\\Cache\\RateLimiting\\Limit::perMinute(60)->by($job->user->id ?: $job->ip());});

// Usage in a controllerpublic function store(Request $request){ if (RateLimiter::tooManyAttempts('send-message:'.$request->ip(), 5)) { return response('Too many messages', 429)

Recommendations