Laravel 5.1 面向对象的 ajax 响应缓存


Laravel 5.1 Object oriented ajax response caching

我正在做一个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缓存可以解决问题。