如何正确缓存我的Symfony2 API?

时间:2012-08-20 13:20:03

标签: api rest caching symfony

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

我现在有三个关于此工作流程和缓存的问题:

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

  • 对于记录的用户权限(我基本上有4个不同的权限级别),我有相同网址的API产生不同的输出。问题是:这是一个好模式吗?拥有4个不同的网址,每个网址对应一个,我可以缓存,这不是更好吗?如果没有,如何在其上实现适当的缓存?

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

感谢您的回答和指示。

1 个答案:

答案 0 :(得分:8)

我遇到过类似的问题(包括所有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()

  4. 关于你的第二点,REST约定(以及反向代理推荐),GET& HEAD请求并不意味着在请求之间进行更改。因此,如果内容根据登录用户而更改,则应将响应设置为private&完全阻止反向代理缓存的缓存。

    如果速度需要缓存,则应在内部和外部进行处理。而不是反向代理

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

    至于你的第三点,因为HTTP& HTTPS流量正在达到相同的缓存和范围。回应是公共/私人&缓存控制设置明确设置,AppCache提供相同的响应安全和放大不安全的交通。

    我希望这对我有所帮助!