litespeed/lscache-laravel

Laravel 的 LSCache 实现版本

v1.3.6 2024-03-11 08:52 UTC

This package is auto-updated.

Last update: 2024-09-11 10:02:11 UTC


README

此软件包允许您将 lscache 与 Laravel 一起使用。

它提供了两个中间件和一个外观

  • LSCache 中间件,用于控制 LiteSpeed LSCache 的缓存控制头
  • LSTags 中间件,用于控制 LiteSpeed LSCache 的标签头
  • LSCache 外观,用于处理清除

安装

使用 composer 需要此软件包。

composer require litespeed/lscache-laravel

Laravel 使用自动发现,因此您不需要对您的应用程序进行任何更改,两个中间件和外观将从一开始就可用。

Laravel >=5.1 和 <=5.4 的步骤

该软件包也可以用于 Laravel 5.1 到 5.4,但由于缺乏自动发现,必须执行一些额外的步骤。

config/app.php 中,您必须将以下代码添加到您的 aliases

'aliases' => [
    ...
    'LSCache'   => Litespeed\LSCache\LSCache::class,
],

app/Http/Kernel.php 中,您必须在 middlewarerouteMiddleware 下添加两个中间件

protected $middleware = [
    ...
    \Litespeed\LSCache\LSCacheMiddleware::class,
    \Litespeed\LSCache\LSTagsMiddleware::class,
];

protected $routeMiddleware = [
    ...
    'lscache' => \Litespeed\LSCache\LSCacheMiddleware::class,
    'lstags' => \Litespeed\LSCache\LSTagsMiddleware::class,
];

lscache.php 复制到 config/

将软件包 config/lscache.php 文件复制到您的 config/ 目录。

重要:不要在 config/app.php 中的 providers 下添加 ServiceProvider。

Laravel 5.5 及以上版本的步骤

您应该发布软件包配置,这允许您设置 X-LiteSpeed-Cache-Control 头的默认值

php artisan vendor:publish --provider="Litespeed\LSCache\LSCacheServiceProvider"

启用 LiteSpeed Cache 的 CacheLookup

要启用 LiteSpeed Cache 的 CacheLookup,您必须包含以下代码,无论是在服务器、虚拟主机还是 .htaccess 级别

<IfModule LiteSpeed>
   CacheLookup on
</IfModule>

使用方法

该软件包包含 3 个功能:为 lscache 设置缓存控制头、设置特定标签和清除。

缓存控制

您可以在 config/lscache.php 文件中配置默认值,在这里您可以设置 max-age(《default_ttl》),缓存性(《default_cacheability》),如公共、私有或无缓存或启用 esi(《esi》)在 X-LiteSpeed-Cache-Control 响应头中。

如果 default_ttl 设置为 0,则我们不会返回 X-LiteSpeed-Cache-Control 响应头。

您可以在 .env 文件中控制配置设置,如下所示

  • LSCACHE_ESI_ENABLED - 接受 truefalse 以决定是否全局启用 ESI;默认 false
  • LSCACHE_DEFAULT_TTL - 接受一个整数,此值以秒为单位;默认:0
  • LSCACHE_DEFAULT_CACHEABILITY - 接受一个字符串,您可以使用值如 privateno-cachepublicno-vary;默认:no-cache
  • LSCACHE_GUEST_ONLY - 接受 truefalse 以决定是否只为访客启用缓存;默认 false

您可以使用中间件设置 lscache 的缓存控制头,因此我们可以在我们的路由中这样做

Route::get('/', function() {
    return view('frontpage');
});

Route::get('/about-us', function() {
    return view('about-us');
})->middleware('lscache:max-age=300;public');

Route::get('/contact', function() {
    return view('contact');
})->middleware('lscache:max-age=10;private;esi=on');

Route::get('/admin', function() {
    return view('admin');
})->middleware('lscache:no-cache');

以下有 4 个示例

  • / 路由将使用您在 config/lscache.php 中配置的默认 X-LiteSpeed-Cache-Control 头。
  • /about-us 路由设置了 300 秒的最大年龄以及将缓存性设置为 public,请注意您将使用分号(《;`)来分隔这些值。
  • 《/contact》路由使用最大缓存时间10秒,使用私有缓存并启用ESI。启用ESI后,您可以在blade模板中使用<esi:include>,这些将被LiteSpeed Web Server的ESI引擎解析。
  • 通过设置X-LiteSpeed-Cache-Control: no-cache头,确保/admin路由永远不会被缓存。

现在,您也可以将相同的中间件应用到Laravel的路由组中,以下是一个示例

Route::group(['prefix' => 'admin', 'middleware' => ['lscache:private;esi=on;max-age=120']], function() {
    Route::get('/dashboard', function() {
        return view('dashboard');
    });

    Route::get('/stats', function() {
        return view('stats');
    })->middleware('lscache:no-cache');
});

在上面的例子中,我们将整个admin组设置为私有,启用ESI,最大缓存时间为120秒,但在/admin/stats路由中,我们覆盖了X-LiteSpeed-Cache-Control头,将其设置为no-cache

标签

您还可以使用lstags中间件为LSCache设置标签。如果我们以前面的admin路由组为例

Route::group(['prefix' => 'admin', 'middleware' => ['lscache:private;esi=on;max-age=900', 'lstags:admin']], function() {
    Route::get('/dashboard', function() {
        return view('dashboard');
    });

    Route::get('/users', function() {
        return view('users');
    });
});

这里我们添加了lstags:admin中间件,这意味着缓存将被标记为admin标签,因此当我们以后想要清除缓存时,我们可以使用标签admin来定位所有管理页面。

您还可以创建更复杂的标签

Route::get('/view', function() {
    return view('view');
})->middleware(['lscache:private', 'lstags:public:pubtag1;public:pubtag2;public:pubtag3;privtag1;privtag2']);

清除

如果有一个管理界面控制例如博客,当您发布一篇新文章时,您可能希望清除博客首页,以便文章出现在概览中。

您可以在控制器中这样做

<?php

namespace App\Http\Controllers;

use LSCache;

class BlogController extends BaseController
{
    // Your article logic here

    LSCache::purge('/');
}

在上面的例子中,我们只是简单地告诉它添加一个名为X-LiteSpeed-Purge的附加头,其值为stale,/,这将使网站首页无效。

您也可以清除所有内容

LSCache::purge('*');
// or
LSCache::purgeAll();

可以通过使用逗号分隔的列表清除一个或多个URI

LSCache::purge('/blog,/about-us,/');
// or
LSCache::purgeItems(['/blog', '/about-us', '/']);

您也可以清除单个或多个标签

LSCache::purge('tag=archive, tag=categories');
// or
LSCache::purgeTags(['archive', 'categories']);

或者,如果您想按标签清除私有缓存

LSCache::purge('private, tag=users');

您甚至可以清除一组公共标签和所有私有标签

LSCache::purge('pubtag1, pubtag2, pubtag3; private, *');

LiteSpeed Cache for Laravel 1.1.0默认为LSCache::purge函数开启了stale选项,这可以通过在purge函数中将false作为第二个参数来关闭

LSCache::purge('*', false);
// or
LSCache::purge('*', $stale=false);
// or
LSCache::purgeAll(false);

为什么stale清除很重要

默认情况下,LiteSpeed中的Lscache通过清除缓存中的元素来工作,并生成下一次请求的缓存版本。

如果您的网站流量较低,这将非常好,但如果您的应用程序处理给定请求需要2秒钟,那么在那些2秒钟内接收到的所有流量都会击中后端,所有访客都会击中PHP。

通过在“key”前使用stale,关键字,您告诉Lscache清除该元素,但如果多个访客连续击中相同的端点,则只有第一个访客会生成缓存项,其余访客将获得直到新缓存页面可用为止的过时缓存页面。

由于页面生成应该相当快,因此我们只为可能几秒钟的过时内容提供服务,这也是它默认启用的原因。

如果您的应用程序根本无法处理过时内容,则可以在LSCache::purge()函数中将false$stale=false作为第二个参数来禁用此功能。

您还可以通过在标签后添加~s来清除特定公共标签

LSCache::purge('pubtag1, pubtag2~s, pubtag3; private, privtag1, privtag2', $stale=false);

只有pubtag2将提供过时内容。

Laravel身份验证

如果您使用Laravel中的身份验证来处理访客和登录用户,您可能还想根据此将缓存分开。

这可以通过在.htaccess文件中使用cache-vary在Authorization cookie上完成

RewriteEngine On
RewriteRule .* - [E=Cache-Vary:Authorization]

注意:在上面的示例中,我们使用 Authorization,这个名称可能会根据您的配置有所不同,因此需要相应地进行更改。