jkniest / htmlcache
laravel的简单HTML缓存中间件
Requires
- laravel/framework: ^5.4|^5.5|^5.6
Requires (Dev)
- orchestra/testbench: ^3.6
- phpunit/phpunit: ^7.0
This package is not auto-updated.
Last update: 2020-01-21 10:43:23 UTC
README
此包通过缓存最终渲染的HTML和头部字段来提高您的laravel应用程序的速度。这意味着您的数据库查询和视图加载算法不需要在每次页面加载时都运行。
如果您有很多静态页面(或不太经常更改的页面),则此包非常适合您。这意味着,作品集、博客、着陆页等等。
并且它具有高度的可定制性:您甚至可以缓存每个用户不同的同一页面,这样您就可以缓存例如他们的账户页面或仪表板,而不用担心其他用户会看到这些缓存的页面。
与其他许多HTML缓存相比的一个优点:它还会根据语言和(可选)用户ID缓存页面。如果存在需要用于生成同一页面多个版本的特殊情况(例如特定的会话值),则中间件可以轻松修改。
目录
- 安装
- 使用
2.1. 对所有Web路由
2.2. 仅对特定路由 - 何时页面不会缓存?
- 配置
4.1. 启用/禁用缓存
4.2. 缓存前缀
4.3. 缓存时间
4.4. 用户特定缓存 - 忽略路由
- 清除缓存
- 覆盖中间件
- 路线图
- 许可
安装
安装过程非常简单。就像其他任何laravel包一样。
- 在控制台中运行以下命令将包作为composer依赖项添加
composer require jkniest/htmlcache
如果您使用的是laravel 5.5或更高版本,则安装已完成。您现在有多种方式可以使用中间件(参见 使用)。
否则,如果您使用的是laravel 5.4或更低版本,请进行以下步骤
- 将包服务提供程序添加到您的包配置中。打开
config/app.php
文件,并将以下内容添加到您的providers
数组中
'providers' => [ // ... JKniest\HtmlCache\HtmlCacheServiceProvider::class, // ... ]
- 完成!现在您可以在项目中使用此中间件了。您现在有多种方式可以使用中间件(参见 使用)
使用
对所有Web路由
如果您想将此中间件应用于每个Web路由(Web路由=没有API路由),您可以将此添加到全局Web中间件组中。
将以下行添加到您的app/Http/Kernel.php
文件中的middleware-group web变量内
protected $middlewareGroups = [ 'web' => [ // ... \JKniest\HtmlCache\Http\Middleware\CacheHtml::class, // ... ], // ... ]
现在每个单个Web路由都使用HTML缓存。它将正常工作!你不需要做任何其他的事情。如果你想深入了解(也许想忽略一些特定的路由),请参阅配置。
仅针对特定路由
如果你不希望在任何Web路由上应用此中间件,你只能在其特定的路由或路由组中使用。
首先,你应该在你的app/Http/Kernel.php
文件中添加一个别名
protected $routeMiddleware = [ // ... 'htmlcache' => \JKniest\HtmlCache\Http\Middleware\CacheHtml::class // ... ]
现在你可以在路由或路由组中定义中间件
单一路由:(在routes/web.php
中)
Route::middleware('htmlcache')->get('/route', 'Controller@action');
路由组:(在routes/web.php
中)
Route::group(['middleware' => 'htmlcache'], function () { Route::get('/route', 'Controller@Action'); });
控制器:(在app/Http/Controllers/...
中)
public function __construct() { $this->middleware('htmlcache'); }
页面何时不会缓存?
在少数情况下,页面将不会进行缓存
- 如果HTTP方法不是
GET
- 如果配置中禁用了HTMLCache
- 如果配置中忽略了当前页面的路径
- 如果有验证错误
- 如果状态码不是200
配置
你可以在.env
文件中配置几乎任何事情。
启用/禁用缓存
启用或禁用整个缓存系统。如果此值设置为false,则不会缓存新页面,也不会加载旧缓存。
HTML_CACHE_ENABLED=true
缓存前缀
一个简单的前缀,将被添加到所有缓存键中。默认键是html_
。因此,一个缓存键看起来可能如下所示:html_aboutus_en
HTML_CACHE_PREFIX="html_"
缓存时间
每个页面应该缓存的分钟数。在这些分钟后,缓存将在下一次页面加载时重新生成。默认值为360 Minutes
(= 6小时)
HTML_CACHE_MINUTES=360
用户特定
如果此值设置为true,则缓存键将包含用户ID。如果用户未登录,则使用-1
代替(因此每个访客都共享缓存的结果,而登录的用户都有自己的缓存版本)。这对于要缓存用户特定页面(如仪表板)非常有用。默认值为false
。
HTML_CACHE_USER_SPECIFIC=false
忽略路由
可以忽略特定的路由。你需要通过使用此命令发布默认配置
php artisan vendor:publish --tag=htmlcache
这将在你的项目中创建一个新文件:config/htmlcache.php
。在那里,你可以通过简单地将这些添加到ignored
数组中来配置任何忽略的路由
/** * HTML cache ignored routes */ 'ignored' => [ '/admin', '/another/ignored/route', ]
清除缓存
HTML缓存包使用默认的Laravel缓存助手。因此,你可以运行Artisan命令来清除缓存
php artisan cache:clear
这将删除此插件的所有缓存版本(以及所有其他内容)。建议将其放入你的部署工作流程中(例如,在forge的部署脚本中或作为envoyer的部署钩子)
覆盖中间件
可以覆盖中间件。因此,您可以覆盖缓存密钥生成。在本简短教程中,我们将向缓存密钥生成中添加另一个字段(当前星期几)。
假设您有一个仪表板,并且该仪表板上的所有数据每周工作日才会更新。在默认实现中,您需要设置一个最大缓存时间(例如1天),但您不能确定缓存是在午夜0点生成的。
最简单的解决方案是覆盖中间件并扩展缓存密钥生成。
- 在
app/Http/Middleware
文件夹内创建一个新的中间件。您可以随意命名,在本例中我将命名为:HtmlCache.php
<?php namespace App\Http\Middleware; use Closure; class HtmlCache extends \JKniest\HtmlCache\Http\Middleware\CacheHtml { }
现在我们可以覆盖任何方法。方法 getCacheKey
处理缓存密钥的生成。默认实现如下
protected function getCacheKey(string $page) { $prefix = config('htmlcache.prefix'); $locale = app()->getLocale(); $page = md5(trim($page, '/')); if (config('htmlcache.user_specific')) { $id = Auth::check() ? Auth::id() : -1; return "{$prefix}{$page}_{$locale}_{$id}"; } return "{$prefix}{$page}_{$locale}"; }
让我们实现自己的(在刚刚创建的HtmlCache中间件中)
protected function getCacheKey(string $page) { $key = parent::getCacheKey($page); $key .= date('D'); return $key; }
最后一步是将我们自己的中间件注册为别名或在kernel文件中(而不是使用默认实现)
在 app/Http/Kernel.php
protected $routeMiddleware = [ // ... 'htmlcache' => \App\Http\Middleware\HtmlCache::class, // ... ];
当然,您始终可以覆盖任何其他方法(如 Handle
方法本身)。
许可证
版权所有 Jordan Kniest
特此授予任何人免费获得本软件及其相关文档文件(“软件”)的副本的权利,以无限制地处理软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本,并允许向软件提供副本的人这样做,前提是符合以下条件
上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。
本软件按“现状”提供,不提供任何形式的质量保证,明示或暗示,包括但不限于适销性、针对特定目的的适用性和非侵权性保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论是基于合同、侵权或其他原因,无论该索赔、损害或其他责任是否源于、源于或与软件或其使用或任何其他交易有关。