Stale While Revalidate (SWR) is a strategy to first return the data from the cache (stale), then send the fetch request (revalidate), and finally come up with the up-to-date data.
Update: Laravel since version 11.23 now has its own "Stale while revalidate" method with
Cache::flexible()
We can add similar functionality to Laravel's Cache Facade, which first returns the cached value and then, after the request is returned, will go and update the value for the next time the value is requested.
Laravel's Cache helper has a Macroable
trait, which allows us to add any method that we like to the Facade:
// In a service provider use Illuminate\Support\Facades\Cache; public function boot() { Cache::macro('staleWhileRevalidate', function ($key, $ttl, $callback) { if (Cache::has($key)) { App::terminating(fn() => Cache::put($key, $callback(), $ttl)); } return Cache::remember($key, $ttl, $callback); }); }
The code above has the same functionality as the ->remember
method on the default Cache helper, except that when there is a value in the cache, a terminating
callback is added to the application, which will recalculate the callback and put it in the cache.
This allows you to set a way longer $ttl
than you'd typically like because every time the cached value is requested from the cache, it will be recalculated after the response has been sent to the browser. This way, the next time it is requested, you get a fresh recalculated value.