gpt4 book ai didi

api - 如何正确缓存我的 Symfony2 API?

转载 作者:行者123 更新时间:2023-12-04 14:31:46 24 4
gpt4 key购买 nike

我正在 Symfony2 上制作经典的无状态 RESTfull API:用户/应用程序在身份验证 API 上获取身份验证 token ,并将其提供给所有其他 API 以记录并在其他 API 上发布数据/访问 protected /私有(private)/个人数据。

我现在对这个工作流程和缓存有三个担忧:

  • 如何为我的“静态”API 使用 HTTP 缓存(始终提供相同的内容,无论登录的用户及其 token )假设不同的用户将在 url 中为同一 API 传递不同的 token ,以便 url 将永远不一样?那么如何使用 HTTP 共享缓存呢?
  • 关于记录的用户权限(我基本上有 4 个不同的权限级别),我有相同 url 的 API 产生不同的输出。问题是:这是一个好的模式吗?有 4 个不同的 url,每个权利一个,我可以缓存不是更好吗?如果没有,如何实现适当的缓存?
  • 共享 HTTP 缓存是否适用于 HTTPS?如果没有,我应该实现哪种类型的缓存,以及如何实现?

  • 感谢您的回答和说明。

    最佳答案

    我遇到了类似的问题(所有 3 个场景),并且成功地使用了 Symfony 内置的反向代理缓存的以下策略:

  • 如果使用 Apache,请更新 .htaccess为您的应用程序添加一个环境变量到 http 缓存关闭(注意:环境自动添加 REDIRECT_ 到环境变量):
    # Add `REDIRECT_CACHE` if API subdomain
    RewriteCond %{HTTP_HOST} ^api\.
    RewriteRule .* - [E=CACHE:1]

    # Add `REDIRECT_CACHE` if API subfolder
    RewriteRule ^api(.*)$ - [E=CACHE:1]
  • 将此添加到 app.php实例化后AppKernel :
    // If environment instructs us to use cache, enable it
    if (getenv('CACHE') || getenv('REDIRECT_CACHE')) {
    require_once __DIR__.'/../app/AppCache.php';

    $kernel = new AppCache($kernel);
    }
  • 对于您的“静态”API,您所要做的就是获取您的响应对象并对其进行修改:
    $response->setPublic();
    $response->setSharedMaxAge(6 * 60 * 60);

    因为你有一个 session 、用户或安全 token ,Symfony 实际上默认为 $response->setPrivate() .

  • 关于您的第二点,REST 约定(以及反向代理建议)、GET 和 HEAD 请求并不意味着在请求之间进行更改。因此,如果基于登录用户的内容发生更改,您应该将响应设置为私有(private)并完全防止反向代理缓存的缓存。

    如果需要缓存以提高速度,则应在内部处理而不是由反向代理处理。

    因为我们不想基于每个用户角色引入 URL,所以我们只是在内部(使用 Redis)按角色缓存响应并直接返回它,而不是让缓存(错误)处理它。

    至于您的第三点,因为 HTTP 和 HTTPS 流量正在访问相同的缓存,并且响应明确设置了公共(public)/私有(private)和缓存控制设置, AppCache为安全和不安全的流量提供相同的响应。

    我希望这对我有帮助!

    关于api - 如何正确缓存我的 Symfony2 API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12038462/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com