[扩展推荐] JosephSilber/page-cache Laravel 静态页面缓存

翻译 Summer ⋅ 于 6个月前 ⋅ 最后回复由 jinyu 3周前 ⋅ 1683 阅读 ⋅ 原文地址

站点的翻译文章创建时,您将第一时间收到通知。

这是一篇社区协同翻译的文章,已完成翻译,更多信息请点击 协同翻译介绍

file

Laravel 页面缓存

这个包允许您轻松地将响应缓存为磁盘上的静态文件,以便更快速地加载页面。

介绍

当静态网站构建器例如 Jekyll 和 Jigsaw 在现今十分流行的时候,动态的PHP网站仍然提供了很大的价值,即使是一个大多是静态的网站。一个正确的PHP网站可以让您轻松地在需要的地方添加动态功能,也意味着根本不需要去推送更新等这些构建步骤。

这就是说,对于网站上真正的静态页面,真的是没有理由要必须启动一个完整的PHP应用程序来提供静态页面,而从磁盘提供一个简单的HTML页面速度更快,对服务器的要求更低。

解决方案就是整页缓存。

使用这个包里面的中间件,可以有选择地缓存对任何请求的响应到磁盘中。随后对同一页面的调用将直接作为静态html页面提供!

科大大 翻译于 6个月前

安装

用 composer 安装 page-cache 包:

$ composer require silber/page-cache

服务提供者

注意:如果你使用Laravel5.5+,service provider 会自动注册,你可以完全忽略这一步骤。

找到 config/app.php 并添加这一段到 providers 数组中:

Silber\PageCache\LaravelServiceProvider::class,
科大大 翻译于 6个月前

中间件

打开 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 */
];

当注册了中间件后,你就可以参考这里 use this middleware on individual routes.

科大大 翻译于 6个月前

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 /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]
科大大 翻译于 6个月前

忽略缓存文件

为了确保你不把你的本地缓存文件提交到你的git仓库,添加这行到你的 .gitignore 文件中:

/public/page-cache

使用

使用中间件

注意:如果你添加这个中间件到全局 web 中间件组中,那么所有的成功的 GET 请求都会被缓存下来,这就不需要再把中间件添加到路由中了。

如果您将其注册为路由中间件,那么您应该在要缓存的任何路由上使用中间件。

如果要缓存指定请求的响应,使用 page-cache 中间件:

Route::middleware('page-cache')->get('posts/{slug}', 'PostController@show');

现在每一篇文章都会缓存在 public/page-cache 目录中,需要完全匹配 URL 结构,所有后续的这个帖子的请求将直接由磁盘提供,甚至都不会去请求你的应用程序!

科大大 翻译于 6个月前

清除缓存

由于响应作为静态文件缓存到磁盘,所以应用程序中这些页面的任何更新都不会在您的网站上有所展示,如果要更新您网站上的页面,您应该使用以下命令清除缓存:

php artisan page-cache:clear

一个经验之谈,将这个命令添加到您的部署脚本是一种很好的做法。
这样,无论何时更新代码并推送到您的站点的时候,页面缓存都将自动清除。

如果你使用 Forge 的快速部署功能,你应该在你部署脚本的最后加入这行命令,这将确保当您将更新推送到您的网站时,缓存被清除。

证书

这个 Page Cache 包是完全开源并遵循 MIT license 的。

科大大 翻译于 6个月前

原文地址:https://github.com/JosephSilber/page-cac...

译文地址:https://laravel-china.org/topics/7939/ex...


本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

本帖已被设为精华帖!

文章译者

回复数量: 1
  • @Summer
    [InvalidArgumentException]
    Could not find package silber/page-cache.

    Did you mean this?
    silber/page-cache

    file
    请问这个是啥么原因吖,怎么解决?

    5个月前
您需要登陆以后才能留下评论!

Composer 中国全量镜像

Top 250 扩展包

Lumen 中文文档

Laravel 速查表

Laravel 中文文档

Laravel 项目开发规范

Laravel 开发环境部署

Composer 中文文档

Elasticsearch-PHP 中文文档

Lumen 中文文档

GraphQL PHP 中文文档

社区文档撰写指南

TDD 构建 Laravel 论坛笔记

PHP PSR 标准规范

PHP 设计模式全集

Dingo API 中文文档