【问题标题】:How to properly cache my Symfony2 APIs?如何正确缓存我的 Symfony2 API?
【发布时间】:2012-08-15 19:56:04
【问题描述】:

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

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

    1234563 ,这样 url 就不会一样了?那么如何使用 HTTP 共享缓存呢?
  • 关于登录的用户权限(我基本上有 4 个不同的权限级别),我有相同 url 的 API 产生不同的输出。问题是:这是一个好的模式吗?拥有 4 个不同的 url,每个权利一个,我可以缓存不是更好吗?如果没有,如何在其上实现适当的缓存?

  • 共享 HTTP 缓存是否在 HTTPS 上工作?如果没有,我应该实现哪种类型的缓存,以及如何实现?

感谢您的回答和说明。

【问题讨论】:

    标签: api rest caching symfony


    【解决方案1】:

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

    1. 如果使用 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]
      
    2. 在实例化AppKernel 后将其添加到app.php

      // 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);
      }
      
    3. 对于您的“静态”API,您所要做的就是获取您的响应对象并对其进行修改:

      $response->setPublic();
      $response->setSharedMaxAge(6 * 60 * 60);
      

      因为你有一个会话、用户或安全令牌,Symfony 实际上默认为$response->setPrivate()

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

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

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

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

    我希望这对我有最大的帮助!

    【讨论】:

      猜你喜欢
      • 2019-03-13
      • 2020-10-13
      • 2011-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-18
      • 1970-01-01
      • 2012-01-22
      相关资源
      最近更新 更多