我正在做一个Laravel 5.1项目,使用了很多ajax调用返回html块。
为了优化网站的速度,我想实现私有和公共响应缓存。 使用以下代码可以正常工作:
return response()
->json($result)
->header('Cache-Control', 'public, max-age=300');
但是,以这种方式使用它不会保留在 300 秒内更新的帐户对象。
是否有可能允许我清除请求的响应缓存,当且仅当返回的对象已更新时?
也许你可以尝试使用下面这样的东西进行服务器端缓存。 对不起,这很粗糙
function sometest(User $user)
{
/** . . .conditions to check if some data has changed . . . **/
$jsonResponse = Cache::remember(Auth::id() . "_sometest", 300, function () use ($user)
{
$result = $user->all(); //get result here
return $result;
});
return response()->json($jsonResponse);
}
你可以在这里阅读缓存
你也可以试试
- 配置缓存:PHP 工匠配置:缓存
- 路由缓存:PHP 工匠 路由:缓存
- 如果可以的话,利用内存缓存。
正如其他人所说,客户端浏览器需要一个请求来知道数据是否已更新。以下是我会在您的情况下研究的一些解决方案:
服务器端缓存(数据仍需要网络传输):
-
根据您的环境,我会使用"过时和更新"策略设置Nginx + FastCGI缓存。因此,缓存始终得到服务(快速),并且缓存始终刷新。因此,在代码更新后,只有少数请求(一个或多个,取决于刷新缓存的时间)会提供过时的数据。此缓存是基于 URL 的,因此如果您的内容是基于 cookie/会话的,则可能会变得棘手。
-
正如@ZachRobichaud所说,您可以使用Laravel缓存并设置较低的缓存保留时间。假设 10 秒,这意味着在您的内容更新后,请求将最多过时 10 秒。我不知道 laravel 上的"陈旧和更新"方式,但它可以通过队列来完成。
客户端缓存(无需数据传输):
正如我所说,客户端需要知道数据已更新以使缓存无效。
-
通常对于资产,我们通过向文件 URL 添加 GET 参数来执行"缓存突发"。例如"asset?version=1234
with version changing for each deployment. As header cache is URL (and header) based, URL change will force network loading of files. Not tested with text/HTML content-type response, but worth a try if you can update URLs with a parameter you can change in
.env"。如果您有 CD/CI 或可在部署时触发的精简文件,则可以动态完成。在这种情况下,您可以"无限"缓存这些内容,因为"刷新"将通过更改 URL 参数来完成。 -
您可以查看
stale-while-revalidate
Cache-Control
似乎工作相同的标头值:始终提供缓存,并在过期时刷新缓存(还可以查看其他参数,可以为您提供想法)。注意兼容性(没有IE或Safari)。
Laravel缓存可能是最快的实施和测试,看看结果是否适合您。这也取决于有效载荷的大小,如果它很大,浏览器缓存确实更好。如果带宽不是问题,主要是服务器响应时间:在这种情况下,Laravel缓存可以解决问题。