haxibiao/ page-cache
将响应缓存为磁盘上的静态文件,以实现快速的页面加载。
Requires
- php: >=5.5.9
- illuminate/contracts: 5.0 - 5.8|^6.0|^7.0|^8.0
- illuminate/filesystem: 5.0 - 5.8|^6.0|^7.0|^8.0
- symfony/http-foundation: 2.6 - 4|^5.0
Requires (Dev)
- illuminate/container: 5.0 - 5.8|^6.0|^7.0|^8.0
- mockery/mockery: ^0.9.5
- phpunit/phpunit: ^4.8
- symfony/var-dumper: ^4.4|^5.0
Suggests
- illuminate/console: Allows clearing the cache via artisan
README
此软件包允许您轻松地将响应缓存为磁盘上的静态文件,以实现快速页面加载。
简介
虽然像 Jekyll 和 Jigsaw 这样的静态网站构建器在当今非常受欢迎,但对于主要是静态的网站,动态PHP网站仍然具有很多价值。一个合适的PHP网站可以让你轻松地添加所需位置的动力功能,同时也意味着在向网站推送更新时无需进行构建步骤。
话虽如此,对于网站上真正静态的页面,实际上没有必要启动一个完整的PHP应用程序来仅提供静态页面。从磁盘上提供简单的HTML页面要快得多,对服务器的压力也小得多。
解决方案?全页缓存。
使用本软件包中包含的中间件,您可以选择将给定请求的响应缓存到磁盘。对同一页面的后续调用将直接作为静态HTML页面提供!
安装
使用composer安装 page-cache
包
$ composer require silber/page-cache
服务提供商
注意:如果您正在使用Laravel 5.5+,服务提供程序将自动注册。您可以完全跳过此步骤。
打开 config/app.php
并将新项目添加到 providers
数组中
Silber\PageCache\LaravelServiceProvider::class,
中间件
打开 app/Http/Kernel.php
并将新项目添加到 web
中间件组
protected $middlewareGroups = [ 'web' => [ \Silber\PageCache\Middleware\CacheResponse::class, /* ... keep the existing middleware here */ ], ];
该中间件足够智能,只缓存具有200 HTTP状态代码的响应,并且仅针对GET请求。
如果您只想选择性地缓存对您网站的特定请求,请改在 routeMiddleware
数组中添加新的映射
protected $routeMiddleware = [ 'page-cache' => \Silber\PageCache\Middleware\CacheResponse::class, /* ... keep the existing mappings here */ ];
注册后,您可以在单个路由上使用此中间件。
URL重写
为了在缓存后直接提供静态文件,您需要正确配置您的Web服务器以检查这些静态文件。
-
对于nginx
更新您的
location
块的try_files
指令以包括对page-cache
目录的检查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; }
-
对于apache
打开
public/.htaccess
并在Handle Front Controller
块之前添加以下内容# Serve Cached Page If Available... RewriteCond %{REQUEST_URI} ^/?$ RewriteCond %{DOCUMENT_ROOT}/page-cache/pc__index__pc.html -f RewriteRule .? page-cache/pc__index__pc.html [L] RewriteCond %{DOCUMENT_ROOT}/page-cache%{REQUEST_URI}.html -f RewriteRule . page-cache%{REQUEST_URI}.html [L] RewriteCond %{DOCUMENT_ROOT}/page-cache%{REQUEST_URI}.json -f RewriteRule . page-cache%{REQUEST_URI}.json [L]
忽略缓存文件
为了确保您不会将本地缓存文件提交到您的git存储库,请将此行添加到您的 .gitignore
文件中
/public/page-cache
使用方法
使用中间件
注意:如果您已将中间件添加到全局
web
组,则所有成功的GET请求将自动缓存。无需在路由上再次直接放置中间件。如果您将其注册为路由中间件,则应在您想要缓存的任何路由上使用中间件。
要缓存特定请求的响应,请使用 page-cache
中间件
Route::middleware('page-cache')->get('posts/{slug}', 'PostController@show');
现在每个帖子都将被缓存在 public/page-cache
目录下的文件中,与请求的URL结构非常相似。对该帖子的所有后续请求将直接从磁盘提供,根本不会触及您的应用程序!
清除缓存
由于响应被缓存为静态文件到磁盘上,您应用程序中这些页面的任何更新都不会反映在您的网站上。要更新您网站上的页面,您应该使用以下命令清除缓存
php artisan page-cache:clear
通常来说,将此命令添加到您的部署脚本中是一个好习惯。这样,每当您向网站推送更新时,页面缓存将自动清除。
如果您正在使用Forge的快速部署功能,您应该将此行添加到部署脚本末尾。这将确保在您向网站推送更新时清除缓存。
您可以选择传递一个URL别名到命令,仅删除特定页面的缓存
php artisan page-cache:clear {slug}
要清除给定路径下的所有内容,请使用--recursive
标志
php artisan page-cache:clear {slug} --recursive
例如,假设您在/categories
下有一个分类资源,以下是一些缓存的页面
/categories/1
/categories/2
/categories/5
要清除所有分类的缓存,请使用带有categories
路径的--recursive
php artisan page-cache:clear categories --recursive
自定义缓存内容
默认情况下,所有带有200 HTTP响应代码的GET请求都被缓存。如果您想更改这一点,创建一个扩展包基础中间件的中间件,并用您自己的逻辑覆盖shouldCache
方法。
-
运行
make:middleware
Artisan命令以创建中间件文件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
文件中的中间件引用,以便指向您自己的中间件。
许可证
页面缓存包是开源软件,许可协议为MIT许可。