为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 文件中,注册自定义的中间件。