为Laravel项目增加页面缓存
简介
为页面生成html
格式的缓存文件,存入public
目录,用户访问时直接访问HTML文件,不经过PHP和Laravel,极大的加快载入速度。
以下内容在Laravel 8.X版本中测试通过。
扩展包
https://github.com/JosephSilber/page-cache
使用说明
安装
$ composer require silber/page-cache
中间件
打开app/Http/Kernel.php
,在web
中间件组中增加:
protected $middlewareGroups = [
'web' => [
\Silber\PageCache\Middleware\CacheResponse::class,
/* ... */
],
];
此中间件只缓存HTTP状态码为200且请求方式为 GET 的响应。
如果只想缓存特定的请求,注册一个中间件:
protected $routeMiddleware = [
'page-cache' => \Silber\PageCache\Middleware\CacheResponse::class,
/* ... */
];
这样就可以在特定的路由中使用这个中间件。
Nginx URL 重写
location = / {
try_files /page-cache/pc__index__pc.html /index.php?$query_string;
}
location / {
try_files $uri $uri/ /page-cache/$uri.html /page-cache/$uri.json /index.php?$query_string;
}
忽略缓存文件
在 .gitignore
文件中增加一行:
/public/page-cache
用法
使用中间件
注意: 如果使用了全局的中间件,所有成功的GET请求都会被缓存起来。
在路由中加上 page-cache
中间件,可以缓存特定的请求:
Route::middleware('page-cache')->get('posts/{slug}', 'PostController@show');
会在 public/page-cache
文件夹生成缓存文件。
清理缓存
php artisan page-cache:clear
清理特定URL的缓存:
php artisan page-cache:clear {slug}
自定义要缓存的内容
默认情况下,所有HTTP状态码为200的GET请求都会被缓存。 如果需要自定义,请创建一个继承本中间件的中间件,然后重写 shouldCache
方法。
创建中间件:
php artisan make:middleware CacheResponse
用以下内容替换
app/Http/Middleware/CacheResponse.php
:
<?php
namespace App\Http\Middleware;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Silber\PageCache\Middleware\CacheResponse as BaseCacheResponse;
class CacheResponse extends BaseCacheResponse
{
protected function shouldCache(Request $request, Response $response)
{
// In this example, we don't ever want to cache pages if the
// URL contains a query string. So we first check for it,
// then defer back up to the parent's default checks.
if ($request->getQueryString()) {
return false;
}
return parent::shouldCache($request, $response);
}
}
最后,在
app/Http/Kernel.php
文件中,注册自定义的中间件。