spatie/laravel-varnish

让 Varnish 和 Laravel 搭配使用

2.10.0 2024-02-29 09:13 UTC

This package is auto-updated.

Last update: 2024-08-29 10:16:47 UTC


README

Latest Version on Packagist run-tests 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;
}

我们强烈推荐使用由 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

贡献

有关详细信息,请参阅 贡献指南

安全

如果您发现了关于安全的错误,请发送邮件至 security@spatie.be,而不是使用问题跟踪器。

鸣谢

许可证

MIT 许可证(MIT)。有关更多信息,请参阅 许可证文件