yangze / page-cache
将响应作为磁盘上的静态文件缓存,以实现闪电般的页面加载。
Requires
- php: >=5.5.9
- illuminate/contracts: 5.0 - 5.6
- illuminate/filesystem: 5.0 - 5.6
- symfony/http-foundation: 2.6 - 4
Requires (Dev)
- illuminate/container: 5.0 - 5.6
- larapack/dd: ^1.1
- mockery/mockery: ^0.9.5
- phpunit/phpunit: ^4.8
Suggests
- illuminate/console: Allows clearing the cache via artisan
README
从 JosephSilber/page-cache 分支,并进行了一些修改。
- 更改带有查询字符串的缓存页面。
- 更改 Apache 和 Nginx 规则。
- 添加检查超时的命令。
- 支持从类别开始的缓存文件删除。
- 调试模式不会缓存页面。
- 域名验证
注意:key=a/b/c/d/e这种格式还不支持按类别设置文件的过期时间,配置文件
config/pagecache.php
'timeout' => [ 'pc__index__pc' => 60 * 60 * 3, 'news' => 60 * 60 * 6, '' => 60 * 60 * 24 * 30, // 最晚一个月更新一次 ],
此包允许您轻松地将响应作为磁盘上的静态文件缓存,以实现闪电般的页面加载。
简介
虽然像 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,
发布配置
php artisan vendor:publish --provider="Silber\PageCache\LaravelServiceProvider"
中间件
打开 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$query_string.html /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}%{QUERY_STRING}.html -f RewriteRule . page-cache%{REQUEST_URI}%{QUERY_STRING}.html [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}
自定义要缓存的内容
默认情况下,所有带有200 HTTP响应代码的GET请求都会被缓存。如果您想更改这一点,请创建自己的中间件,它扩展了包的基本中间件,并使用您的逻辑覆盖 shouldCache 方法。
-
运行
make:middlewareArtisan 命令来创建您的中间件文件。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 许可证 许可。