Making Varnish and Laravel play nice together
, (*1)
This package provides an easy way to work with Varnish 4 (or 5) in Laravel 5.2 and PHP version >= 7.0.0. It provides a route middleware that, when applied to a route, will make sure Varnish will cache the response no matter what. The package also contains a function to flush the Varnish cache from within the application., (*2)
Postcardware
You're free to use this package (it's MIT-licensed), but if it makes it to your production environment we highly appreciate you sending us a postcard from your hometown, mentioning which of our package(s) you are using., (*3)
Our address is: Spatie, Samberstraat 69D, 2060 Antwerp, Belgium., (*4)
The best postcards will get published on the open source page on our website., (*5)
Installation
We assume that you've already installed Varnish on your server. If not read this blogpost to learn how to install it., (*6)
You can install the package via composer:, (*7)
``` bash
composer require vatia/laravel-varnish, (*8)
First up: registering the service provider:
```php
// config/app.php
'providers' => [
...
Spatie\Varnish\VarnishServiceProvider::class,
];
Next you must publish the config-file with:, (*9)
php artisan vendor:publish --provider="Spatie\Varnish\VarnishServiceProvider" --tag="config"
This is the contents of the published file:, (*10)
return [
/*
* The location of the file containing the administrative password.
*/
'administrative_secret' => '/etc/varnish/secret',
/*
* The host where the administrative tasks may be sent to.
*/
'administrative_host' => '127.0.0.1',
/*
* The port where the administrative tasks may be sent to.
*/
'administrative_port' => 6082,
/*
* The default amount of minutes that content rendered using the `CacheWithVarnish`
* middleware should be cached.
*/
'cache_time_in_minutes' => 60 * 24,
/*
* The name of the header that triggers Varnish to cache the response.
*/
'cacheable_header_name' => 'X-Cacheable',
];
In the published laravel-varnish.php config file you should set the host key to the right value., (*11)
Add the Spatie\Varnish\Middleware\CacheWithVarnish middleware to the route middelwares:, (*12)
// app/Http/Kernel.php
protected $routeMiddleware = [
...
'cacheable' => \Spatie\Varnish\Middleware\CacheWithVarnish::class,
];
Finally, you should add these lines to the vcl_backend_response function in your VCL (by default this is located at /etc/varnish/default.vcl on your server):, (*13)
if (beresp.http.X-Cacheable ~ "1") {
unset beresp.http.set-cookie;
}
We highly recommend using the VCL provided the varnish-5.0-configuration-templates repo made by Mattias Geniar., (*14)
Usage
Caching responses
The routes whose response should be cached should use the cacheable middleware., (*15)
// your routes file
//will be cached by Varnish
Route::group(['middleware' => 'cacheable'], function() {
Route::get('/', 'HomeController@index');
Route::get('/contact', 'ContactPageController@index');
});
//won't be cached by Varnish
Route::get('do-not-cache', 'AnotherController@index');
The amount of minutes that Varnish should cache this content can be configured in the cache_time_in_minutes key in the laravel-varnish.php config file. Alternatively you could also use a middleware parameter to specify that value., (*16)
// Varnish will cache the responses of the routes inside the group for 15 minutes
Route::group(['middleware' => 'cacheable:15'], function() {
...
)};
Behind the scenes the middleware will add an X-Cacheable and Cache-Control to the response. Varnish will remove all cookies from Laravel's response. So keep in mind that, because thelaravel_session cookie will be removed as well, sessions will not work on routes were the CacheWithVarnish middleware is applied., (*17)
Clearing cache from Varnish
There's an artisan command to flush the cache. This can come in handy in your deployment script., (*18)
php artisan varnish:flush
You can also do this in your code to flush the cache:, (*19)
(new Spatie\Varnish\Varnish())->flush();
You can clear cache for request url using code below:, (*20)
(new Spatie\Varnish\Varnish())->flush("http://example.com/page");
Changelog
Please see CHANGELOG for more information what has changed recently., (*21)
Testing
bash
$ composer test, (*22)
Contributing
Please see CONTRIBUTING for details., (*23)
Security
If you discover any security related issues, please email freek@spatie.be instead of using the issue tracker., (*24)
Credits
About Spatie
Spatie is a webdesign agency based in Antwerp, Belgium. You'll find an overview of all our open source projects on our website., (*25)
License
The MIT License (MIT). Please see License File for more information., (*26)