zaaferani/laravel-varnish

让 Varnish 和 Laravel 顺畅协作

2.9.6 2021-12-27 14:00 UTC

README

Latest Version on Packagist GitHub Workflow Status Total Downloads

此包提供了一个简单的方法来在 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-CacheableCache-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)。有关更多信息,请参阅 许可文件