如何正确缓存我的 Symfony2 API?

2023-12-24

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

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

  • 如何为我的“静态”API 使用 HTTP 缓存(无论登录的用户及其令牌如何,始终提供相同的内容),假设不同的用户在同一 API 的 url 中传递不同的令牌,以便该 url永远不会一样?那么如何使用HTTP共享缓存呢?

  • 我有相同 url 的 API,它们会产生不同的输出,涉及记录的用户权限(我基本上有 4 个不同的权限级别)。问题是:这是一个好的模式吗?有 4 个不同的 url,每个权利一个,我可以缓存不是更好吗?如果没有,如何实现适当的缓存?

  • 共享 HTTP 缓存是否可以在 HTTPS 上运行?如果不是,我应该实施哪种类型的缓存,以及如何实施?

感谢您的回答和启发。


我遇到了类似的问题(所有 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. 将其添加到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);
    }
    
  3. 对于“静态”API,您所要做的就是获取响应对象并修改它:

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

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

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

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

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

至于你的第三点,因为 HTTP 和 HTTPS 流量访问相同的缓存,并且响应具有显式设置的公共/私有和缓存控制设置,因此AppCache为安全和不安全的流量提供相同的响应。

我希望这对我有帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何正确缓存我的 Symfony2 API? 的相关文章

  • 通过API更新Twitter背景

    我在通过 Twitter 的 API 更新背景时遇到了一些问题 target url http www google com logos 11th birthday gif ch curl init curl setopt ch CURLO
  • Web Api - 不允许捕获 405 方法

    截至目前 Web api 应用程序针对 405 方法不允许错误返回以下响应正文 我正在尝试更改响应正文 但我不知道如何使用委托处理程序 ApiControllerActionSelector 或过滤器 谁能帮我捕获服务器端的 405 错误
  • 使用 python 更新 Google 搜索方法

    我试图使用xgoogle https github com pkrumins xgoogle但我已经 3 年没有更新了 即使我设置每页 100 个结果 我也只能得到不超过 5 个结果 如果有人使用 xgoogle 没有任何问题 请告诉我 现
  • 将消息添加到天蓝色存储队列而不使用base64编码?

    我无法将我的请求编码为 base64 并且根据文档我不应该这样做 但我无法弄清楚 如果我 Base64 编码它工作正常
  • Delphi XE5 REST/Android 客户端“会话已过期”

    我有一个REST Server与Android Client 都在Deplhi Xe5 Android客户端成功连接Rest服务器 在我的服务器中我有一个TDSHttpWebDispatcher with SessionTimeout 12
  • 如何将 Live API for Contacts 的响应中的哈希值转换为文本

    我集成了 Live JS api 来获取用户的实时联系人 它以哈希格式 email hash 返回电子邮件 我如何使用 javascript 或 c net 转换为可读文本 非常感谢 我遇到了同样的问题 并且找到了解决方案 您所需要做的就是
  • 如何限制 JSON 访问?

    我有一个 Web 应用程序 可以从新创建的 JSON API 中提取数据 我的静态 HTML 页面通过 JavaScript 从静态 HTML 页面动态调用 JSON API 如何限制对 JSON API 的访问 以便只有我 我的网站 可以
  • Symfony StreamedResponse 服务器发送事件阻止请求

    我在 Symfony 中使用 StreamedResponse 实现了服务器发送事件 SSE 因此 当事件发生时 会话中会保存一条消息 该消息将通知给用户 问题是 当执行包含客户端代码的页面时 它会阻止对应用程序的所有 Web 请求 直到
  • 重置 Windows Phone 照片上传

    我正在尝试使用 RestSharp 将照片上传到 Windows Phone 7 应用程序中的 REST api 进行获取 发布 post参数如下 photo 照片 编码为多部分 表单数据 照片 相册 id 现有相册的标识符 可以是一个事件
  • 使 Django 1.3.1 中的视图缓存过期

    我正在尝试使模型上的视图级缓存过期post save 这是通过设置的https docs djangoproject com en 1 3 topics cache from olddocs the per view cache https
  • 微服务、amqp 和服务注册/发现

    我正在研究微服务架构 实际上我想知道一些事情 我非常同意使用 返回 服务发现来在基于 REST 的微服务上发出请求 我需要知道发出请求的服务 或至少是服务器集群的前端 在哪里 因此在这种情况下能够发现 ip port 是有意义的 但我想知道
  • Symfony 3新建项目报错

    我开始编写有关 Symfony 3 的教程 在使用以下命令创建新项目时遇到问题 php symfony phar new Symfony 我有这个错误 GuzzleHttp Exception RequestException Error
  • 我们如何计算这段代码片段中缓存的读取/未命中次数?

    鉴于我目前正在学习的这本教科书中的代码片段 Randal E Bryant David R O Hallaron 计算机系统 程序员的视角 第 3 版 2016 年 Pearson 全球版 因此本书的练习可能是错误的 for i 31 i
  • Yammer API 限制

    Yammer Rest api 文档表示 每个应用程序每个用户在 10 秒内最多可以发出 10 个请求 问题 什么是user这里 是为当前经过身份验证的 yammer 用户发出请求的 IP 地址还是承载令牌 如果我们所有的用户都使用相同的外
  • StackExchange.Redis Get 函数抛出 TimeoutException

    我在用着StackExchange Redis与 C 和StackExchangeRedisCacheClient Get函数抛出以下异常 myCacheClient Database StringGet txtKey Text myCac
  • symfony2 FOSRestBundle 注释

    有人在控制器中使用过 put get post delete 注释 https github com FriendsOfSymfony FOSRestBundle blob master Controller Annotations 吗 我
  • 使用 willdurand/BazingaJsTranslationBundle 时出现问题

    为了在我的 JavaScript 文件中使用翻译 我实现了willdurand BazingaJsTranslationBundle https github com willdurand BazingaJsTranslationBundl
  • 寻找Android源代码

    Android API 是开源的吗 如果是这样 我想看看他们如何实现 ListView 对象的 smoothscroll 方法 这是在 API 级别 8 中实现的 但我想针对早期的 API 级别进行构建 我该如何找到这个 是的 它是开源的
  • 带点 (.) 的 Spring MVC @PathVariable 被截断

    这是问题的延续Spring MVC PathVariable 被截断 https stackoverflow com questions 3526523 spring mvc pathvariable getting truncated S
  • Ruby on Rails REST 设计问题 - 在账户之间转账

    我有一个 Account 类 想要实现转账屏幕以允许用户在 2 个账户之间转账 我将如何实现这种 RESTful 方式 我有标准帐户和休息操作 那很好 但我该如何实现转移呢 通常我只会向帐户控制器和相应的视图添加一个名为 transfer

随机推荐