Une requête à la base ou un appel API externe est coûteux en CPU et en réseau, et peut prendre plusieurs secondes.
Si les mêmes données sont récupérées à plusieurs reprises, mettre le résultat en cache accélère toutes les requêtes suivantes.Laravel propose une API unifiée pour Memcached, Redis, DynamoDB, base de données et bien d’autres backends.
Le driver par défaut est database. Passer à Redis ou Memcached permet un cache encore plus rapide.
put() stocke une valeur ; TTL en secondes en 3ᵉ argument.
// 10 secondesCache::put('key', 'value', 10);// Carbon pour la date d'expirationCache::put('key', 'value', now()->plus(minutes: 10));// Sans expirationCache::put('key', 'value');
add() n’écrit que si la clé n’existe pas encore (atomique).
Cache::flexible() définit une période « frais » et une période « stale mais utilisable ». On sert du contenu obsolète tout en actualisant le cache en arrière-plan.
// [période fraîche(s), période stale(s)]$value = Cache::flexible('users', [5, 10], function () { return DB::table('users')->get();});
Le driver memo met en cache en mémoire les accès pendant une même requête, réduisant les allers-retours vers le store.
use Illuminate\Support\Facades\Cache;// Store par défaut mémoïsé$value = Cache::memo()->get('key');// Store Redis mémoïsé$value = Cache::memo('redis')->get('key');
// Premier accès : va au store$value = Cache::memo()->get('key');// Suivants : depuis la mémoire$value = Cache::memo()->get('key');
Cache::withoutOverlapping('foo', function () { // Une seule exécution à la fois});// PersonnalisationCache::withoutOverlapping('foo', function () { // ...}, lockFor: 120, waitFor: 5);
Prolongez un verrou en cours avec refresh (sans argument, réutilise le TTL initial). Idéal pour un traitement long sans avoir à fixer un TTL énorme au départ.
$lock = Cache::lock('generate-reports', 60);if ($lock->get()) { foreach ($reports as $report) { $report->generate(); // Prolonge de 60 s $lock->refresh(); } $lock->release();}
use Illuminate\Support\Facades\Cache;use Illuminate\Support\Facades\DB;public function index(): array{ $users = Cache::remember('all-users', 3600, function () { return DB::table('users')->orderBy('name')->get(); }); return compact('users');}
2
Invalidation lors d'un update
public function store(Request $request): RedirectResponse{ User::create($request->validated()); Cache::forget('all-users'); return redirect()->route('users.index');}
use Illuminate\Support\Facades\Cache;class ArticleController extends Controller{ public function show(Article $article): array { $data = Cache::tags(['articles', "article:{$article->id}"]) ->remember("article:{$article->id}:detail", 3600, function () use ($article) { return $article->load(['author', 'tags', 'comments']); }); return compact('data'); } public function update(Request $request, Article $article): RedirectResponse { $article->update($request->validated()); // Purge tout le cache lié à cet article Cache::tags(["article:{$article->id}"])->flush(); return redirect()->route('articles.show', $article); }}