【问题标题】:How to properly cache my Symfony2 APIs?如何正确缓存我的 Symfony2 API?
【发布时间】:2012-08-15 19:56:04
【问题描述】:
我正在 Symfony2 上制作经典的无状态 RESTfull API:用户/应用程序在身份验证 API 上获取身份验证令牌,并将其提供给所有其他 API 以记录和发布数据/访问其他 API 上的受保护/私人/个人数据。
我现在对这个工作流程和缓存有三个担忧:
感谢您的回答和说明。
【问题讨论】:
标签:
api
rest
caching
symfony
【解决方案1】:
我遇到了类似的问题(所有 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]
-
在实例化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);
}
-
对于您的“静态”API,您所要做的就是获取您的响应对象并对其进行修改:
$response->setPublic();
$response->setSharedMaxAge(6 * 60 * 60);
因为你有一个会话、用户或安全令牌,Symfony 实际上默认为$response->setPrivate()。
关于您的第二点,REST 约定(以及反向代理建议)、GET 和 HEAD 请求并不意味着在请求之间发生变化。因此,如果基于登录用户的内容发生更改,您应该将响应设置为私有并完全阻止反向代理缓存的缓存。
如果需要缓存以提高速度,则应在内部处理而不是由反向代理处理。
因为我们不想基于每个用户角色引入 URL,所以我们只是在内部(使用 Redis)按角色缓存响应并直接返回它,而不是让缓存(错误)处理它。
至于您的第三点,因为 HTTP 和 HTTPS 流量正在访问相同的缓存,并且响应明确设置了公共/私有和缓存控制设置,AppCache 在安全和不安全流量中提供相同的响应。
我希望这对我有最大的帮助!