zaaferani / laravel-varnish
让 Varnish 和 Laravel 顺畅协作
Requires
- php: ^7.3|^8.0
- illuminate/console: ^8.73
- illuminate/http: ^8.73
Requires (Dev)
- orchestra/testbench: ^6.23
- phpunit/phpunit: ^9.4
README
此包提供了一个简单的方法来在 Laravel 中使用 Varnish 4(或 5)。它提供了一个路由中间件,当应用于路由时,将确保 Varnish 无论如何都会缓存响应。该包还包含一个从应用程序内部刷新 Varnish 缓存的功能。
支持我们
我们投入了大量资源来创建 一流的开放式源代码包。您可以通过 购买我们的付费产品之一 来支持我们。
我们非常感谢您从家乡寄给我们明信片,说明您正在使用我们的哪些包。您可以在 我们的联系页面 找到我们的地址。我们将发布所有收到的明信片在 我们的虚拟明信片墙上。
安装
我们假设您已经在服务器上安装了 Varnish。如果没有,请阅读 这篇文章 了解如何安装它。
您可以通过 composer 安装此包
composer require spatie/laravel-varnish
该包将自动为 Laravel 5.5+ 注册自己。
如果您使用的是 Laravel < 5.5,您还需要将 Varnish\VarnishServiceProvider
添加到您的 config/app.php
提供者数组中
\Spatie\Varnish\VarnishServiceProvider::class
接下来,如果您使用 Laravel,您必须使用以下命令发布配置文件
php artisan vendor:publish --provider="Spatie\Varnish\VarnishServiceProvider" --tag="config"
如果使用 Lumen,您必须将 config/varnish.php
文件复制到您的应用程序配置文件夹中。
这是发布文件的 内容
return [ /* * The hostname this Laravel app is listening to. */ 'host' => 'example.com', /* * The location of the file containing the administrative password. */ 'administrative_secret' => '/etc/varnish/secret', /* * 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', ];
在发布的 varnish.php
配置文件中,您应该将 host
键设置为正确的值。
将 Spatie\Varnish\Middleware\CacheWithVarnish
中间件添加到路由中间件。
对于 Laravel
// app/Http/Kernel.php protected $routeMiddleware = [ ... 'cacheable' => \Spatie\Varnish\Middleware\CacheWithVarnish::class, ];
如果您使用 Lumen,您需要在定义路由中间件之前将配置文件加载到您的 bootstrap/app.php
$app->configure('varnish'); $app->routeMiddleware([ ... 'cacheable' => \Spatie\Varnish\Middleware\CacheWithVarnish::class, ]);
最后,您应该在您的 VCL 中的 vcl_backend_response
函数中添加这些行(默认情况下,位于您的服务器上的 /etc/varnish/default.vcl
)
if (beresp.http.X-Cacheable ~ "1") {
unset beresp.http.set-cookie;
}
我们强烈推荐使用由 mattiasgeniar/varnish-5.0-configuration-templates 仓库提供的 VCL(由 Mattias Geniar 创建)。
用法
缓存响应
应该缓存响应的路由应使用 cacheable
中间件。
// 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');
配置 Varnish 缓存此内容的分钟数可以在 laravel-varnish.php
配置文件中的 cache_time_in_minutes
键中配置。或者,您也可以使用中间件参数来指定该值。
// Varnish will cache the responses of the routes inside the group for 15 minutes Route::group(['middleware' => 'cacheable:15'], function() { ... });
在幕后,中间件将向响应添加 X-Cacheable
和 Cache-Control
。Varnish 将从 Laravel 的响应中删除所有 Cookie。因此,请记住,由于 laravel_session
Cookie 也会被删除,因此在这些应用了 CacheWithVarnish
中间件的路由上,会话将不会工作。
从 Varnish 清除缓存
有一个 artisan 命令可以刷新缓存。这可以在您的部署脚本中很有用。
php artisan varnish:flush
在底层刷新缓存时将调用 sudo varnishadm
。为了确保没有麻烦地运行,请确保该命令由具有 sudo
权限的 Unix 用户运行。
您也可以在您的代码中执行此操作以刷新缓存
(new Spatie\Varnish\Varnish())->flush();
更新日志
有关最近更改的更多信息,请参阅 更新日志。
测试
$ composer test
贡献
有关详细信息,请参阅 贡献指南。
安全性
如果您发现任何与安全相关的问题,请通过电子邮件 freek@spatie.be 联系,而不是使用问题跟踪器。
致谢
许可协议
MIT 许可协议(MIT)。有关更多信息,请参阅 许可文件。