ldavidsp / laravel-varnish
让 Varnish 和 Laravel 顺利协同工作
Requires
- php: ^7.2||^8.0
- illuminate/console: ~5.8.0|^6.0|^7.0|^8.0
- illuminate/http: ~5.8.0|^6.0|^7.0|^8.0
Requires (Dev)
- orchestra/testbench: ~3.8.0|^4.0|^5.0|^6.0
- phpunit/phpunit: ^8.0|^9.0
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');
在 laravel-varnish.php
配置文件中的 cache_time_in_minutes
键中配置 Varnish 应缓存此内容的时间(分钟数)。或者,您也可以使用中间件参数指定此值。
// 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)。有关更多信息,请参阅 许可证文件。