litespeed / lscache-laravel
Laravel 的 LSCache 实现版本
Requires
- illuminate/support: ^5.1|^6|^7|^8|^9|^10.0|^11.0
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
中,您必须在 middleware
和 routeMiddleware
下添加两个中间件
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
- 接受true
或false
以决定是否全局启用 ESI;默认false
LSCACHE_DEFAULT_TTL
- 接受一个整数,此值以秒为单位;默认:0
LSCACHE_DEFAULT_CACHEABILITY
- 接受一个字符串,您可以使用值如private
、no-cache
、public
或no-vary
;默认:no-cache
LSCACHE_GUEST_ONLY
- 接受true
或false
以决定是否只为访客启用缓存;默认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
,这个名称可能会根据您的配置有所不同,因此需要相应地进行更改。