Laravel
Beginner
1 min read
Job Chaining, Batching, and Rate Limiting
Example
<?php
// Job chaining
use Illuminate\Support\Facades\Bus;
Bus::chain([
new \App\Jobs\OptimizeImage($upload),
new \App\Jobs\GenerateThumbnails($upload),
new \App\Jobs\NotifyUser($upload->user),
])->catch(function (\Throwable $e) {
\Log::error('Chain failed: ' . $e->getMessage());
})->dispatch();
// Job batching
$batch = Bus::batch([
new \App\Jobs\ImportRow($rows->slice(0, 100)),
new \App\Jobs\ImportRow($rows->slice(100, 100)),
new \App\Jobs\ImportRow($rows->slice(200)),
])->then(function (\Illuminate\Bus\Batch $batch) {
\Log::info('All import jobs completed.');
})->catch(function (\Illuminate\Bus\Batch $batch, \Throwable $e) {
\Log::error('Batch failed: ' . $e->getMessage());
})->finally(function (\Illuminate\Bus\Batch $batch) {
// Runs regardless of success/failure
})->dispatch();
// Rate-limited job middleware
use Illuminate\Queue\Middleware\RateLimited;
class CallExternalApi implements \Illuminate\Contracts\Queue\ShouldQueue
{
public function middleware(): array
{
return [new RateLimited('external-api')];
}
}
// Register the limiter in AppServiceProvider::boot()
// \RateLimiter::for('external-api', fn($job) => \Illuminate\Cache\RateLimiting\Limit::perMinute(20));
Related Resources
Laravel Reference
Complete tag & property list
Laravel How-To Guides
Step-by-step practical guides
Laravel Exercises
Practice what you've learned
More in Laravel