我们如何使用 Fast Laravel 在边缘缓存 Laravel 新闻
发布日期 经过 埃里克·巴恩斯
我坐下来和 杰麦克 在 Laravel Creator Series 的演讲中,我们谈到了我们刚刚完成的一项工作:使用他的工具在边缘缓存 Laravel News。 快速 Laravel 课程和 Cloudflare 我们将该网站视为一个案例研究,现在它已经上线,我们想分享一下我们做了什么以及我们在哪里遇到了困难。
有趣的是,Laravel News 是一个流量很高的网站,内容也在不断变化。新文章、新链接、新赞助商,还有页面顶部的提示通知。很多人认为这样的页面无法缓存。但本文的重点在于,它是可以缓存的。
从您的常用页面开始
杰森采取了一种系统化的方法。他查看请求流量,找到访问量最高的页面,并首先缓存这些页面,然后依次向下处理,直到访问量最高的都是低流量的子页面。对我们来说,最终只缓存了大约五个页面:
我们必须克服的三件事
该网站大部分是静态的,但少数特定部分是动态的,因此存在三个主要挑战。
在不需要的地方弃用 Livewire。 该网站的建设使得几乎所有东西都是…… 活线 虽然组件本身使用了 Livewire 的响应式特性,但只有新闻简报表单真正用到了 Livewire 的响应式特性。其他所有组件实际上都只是 Blade 模板。将这些模板转换回纯 Blade 组件是一个非常简单的重构,它隔离了真正需要保持动态特性的少数几个区域。
保持动态部分动态。 有些内容无法冻结在缓存页面中:例如弹出式通知、新闻简报,以及每次请求都会轮换显示的赞助商和合作伙伴广告位,以避免同一合作伙伴全天显示。我们之前已经在使用 Alpine 来运行 Livewire,所以我们添加了 Alpine AJAX 并利用它在页面加载时替换这些组件。
两个缓存层相互竞争。 Laravel News 运行于 Laravel 云 该平台内置了边缘缓存功能,底层使用 Cloudflare。由于我们已经直接使用了 Cloudflare,这两层缓存机制相互冲突,很难判断哪一层的策略生效,也很难彻底禁用 Cloudflare 层。Laravel Cloud 团队在我们排查问题的过程中提供了极大的支持,但最终我们发现绕过 Cloudflare 的规则直接使用我们自己的 Cloudflare 更简单。这样可以获得所有相同的底层优势。
内容更改时清除缓存
我们像其他网站一样在部署时清除缓存,但真正的工作是在文章发布或链接审核通过时清除缓存。这大部分工作都是通过 Laravel 模型事件完成的。当文章更新时,我们会监听……
updated
事件并清除该特定文章,以及首页和博客页面,因为最近的帖子也会显示在那里。
最棘手的是定时发布的文章。我们会在前一天晚上写好文章,然后安排在早上9点发布,所以文章上线时不会触发任何事件,只需要进行一个查询来比较即可。
published_at
最简单的解决方法是利用我们已有的将新帖子分享到社交媒体的命令。现在,该命令还会清除首页、博客、文章和链接页面。最坏的情况是,在命令运行期间,页面会暂时失效大约五分钟。
随时随地都能用
Jason明确表示,这些都不是Laravel Cloud特有的。只要你的应用前端部署了Cloudflare,它就能在任何服务器上运行。他运行 Laravel 转变 他租用了一台每月 5 美元的 DigitalOcean 服务器,每天处理大约 50,000 个请求,并且整个面向公众的页面都进行了缓存,他发现从边缘服务器到目标服务器的响应时间约为 20 毫秒。
目前唯一的例外是 Livewire,因为它严重依赖会话来实现响应。Jason 正在与……交谈 凯莱布·波尔齐奥 关于一个匿名组件,它可以在页面加载后激活。Inertia、React 以及任何其他调用 API 的框架都可以。
对我们来说,效果立竿见影。Laravel News 的缓存率从十几提升到了绝大多数请求,峰值甚至接近 70%,网站速度明显提升。下一步计划是大约一个季度后再次测试,看看服务器流量的减少是否能让我们降低计算资源等级,而不会引起任何用户注意。
一探究竟
请观看视频了解完整对话,并去看看…… 快速 Laravel 正如杰森所说,边缘缓存是那些被遗忘的实践之一,值得重新审视。一旦你学会了它,你就可以将其应用到你构建的每一个网站中。






