area17/edge-flush

CDN 缓存控制与失效


README

GitHub PHPUnit Action Status GitHub PHPStan Action Status

EdgeFlush 是一个 Laravel 包,旨在帮助开发者管理 CDN 粒度缓存和失效。在网站前面有 Akamai、CloudFront(或任何其他 CDN)时,数据修改通常迫使我们清除整个缓存,导致网站速度变慢(对于第一个用户),直到整个缓存重建,如果“第一个用户”是 Google Bot,例如,这也可能影响您的网站排名。这个包旨在进行粒度失效。

特性列表

  • 粒度失效:此包将创建一个影响一个页面的所有模型的集合,当这些模型中的任何一个发生变化时,之前请求中渲染了该模型的页面将从 CDN 中清除。
  • 粒度控制 Cache-Control 头:您将能够按请求不同地配置它,告诉 CDN 存储某些页面一周,其他页面5秒,例如。
  • 单个与页面渲染影响的全部模型相关的 Akamai Edge Cache Tag
  • 定义不同的 Cache-Control 策略:网页可能比 API 端点具有不同的缓存策略。
  • 防止缓存包含表单的页面。
  • 仅缓存前端页面,如果需要,则不缓存 CMS。
  • 重新加热已从缓存中清除的页面。
  • 从可缓存的响应中删除 Cookie。
  • 使用中间件禁用某些页面的缓存。
  • 定义允许或不允许缓存的 HTTP 方法:缓存 GET 但不缓存 POST。
  • 定义允许或不允许缓存的 HTTP 响应状态码:缓存 200 和 301 但不缓存 400+ 状态码。
  • 定义 CDN 可以或不可以缓存的路由。
  • 定义可以或不可以缓存的响应类型:缓存 Response 但不缓存 JsonResponse,例如。
  • 定义可以或不可以缓存的 Model 类。
  • 记住哪些页面已被缓存,并命令您的 CDN 服务在您在后台保存某些内容时仅清除这些页面。
  • 支持 CloudFront 失效。
  • 支持 Akamai EdgeCacheTags 失效。
  • 允许覆盖服务,并易于实现以支持新的 CDN 服务。
  • Spatie's Laravel Response Cache 粒度失效。

安装

通过 composer 安装包

composer require area17/edge-flush

使用

php artisan vendor:publish --provider="A17\EdgeFlush\ServiceProvider"

运行迁移

php artisan migrate

依赖

支持的 CDN 服务有以下包依赖项,您需要根据您的设置进行选择

Akamai: akamai-open/edgegrid-auth CloudFront: aws/aws-sdk-php

使用

config/edge-flush.php 中进行完整阅读,有很多配置项,我们尽力对它们进行了文档化。

config/edge-flush.php 中定义您的 CDN 服务类

'classes' => [
    'cdn' => A17\EdgeFlush\Services\CloudFront\Service::class,
    
    ...
]

将特质 A17\EdgeFlush\Behaviours\CachedOnCDN 添加到您的模型和仓库中。

每次模型(在您的基模型或仓库 save() 方法中)更改时,都调用 $this->invalidateCDNCache($model)。此示例考虑了 Twill's 仓库

public function afterSave($object, $fields)
{
    $this->invalidateCDNCache($object);

    parent::afterSave($object, $fields);
}

在模型的 getAttribute() 上调用 $this->cacheModelOnCDN($model) 方法

public function getAttribute($key)
{
    $this->cacheModelOnCDN($this);

    return parent::getAttribute($key);
}

将中间件添加到 Kernel.php 文件

protected $middleware = [
    \A17\EdgeFlush\Middleware::class,
    ...
];

Cache-Control的max-age和s-maxage会被自动设置,但如果你需要根据当前请求来更改它,可以使用以下方法

CacheControl::setMaxAge(5000); // in seconds

CacheControl::setMaxAge('1 month'); // as a DateTime string period

CacheControl::setSMaxAge('2 weeks');

如果你想批量使你的路径失效,可以添加一个调度器来设置希望发生此操作的时间间隔

protected function schedule(Schedule $schedule)
{
    $schedule->job(new PurgeTags())->everyMinute();
}

你需要在你的.env文件中启用该软件包和预热器

EDGE_FLUSH_ENABLED=true
EDGE_FLUSH_WARMER_ENABLED=true

CDN第三方服务配置

请检查支持的服务所需的相应环境变量,以便它们能够正常工作

重新预热缓存

如果清除的缓存页面对于下一个用户或甚至Google Bot加载速度较慢,为了防止这种情况,你可以在配置中启用缓存预热器并将作业添加到调度中

protected function schedule(Schedule $schedule)
{
    $schedule->job(new WarmCache())->everyMinute();
}

请注意,最常被访问(或频繁更新的)页面将首先被预热。

Akamai边缘缓存标签

Akamai对标签列表的大小有限制,为128字节,所以如果一个页面受到许多模型的影响,我们别无他法,只能每次都清除整个缓存。这个软件包创建一个与页面渲染时接触到的所有模型相关的单个边缘缓存标签,并将其添加到响应头中

edge-cache-tag: app-production-7e0ae085d699003a64e5fa7b75daae3d78ace842

从命令行清除整个缓存

如果你需要在本地上或部署路由中清除整个CDN缓存,你可以

php artisan edge-flush:invalidate-all

变更日志

有关最近更改的更多信息,请参阅变更日志

贡献

有关详细信息,请参阅贡献指南

安全漏洞

请审查我们的安全策略,了解如何报告安全漏洞。

鸣谢

许可证

MIT许可证(MIT)。有关更多信息,请参阅许可证文件