簡體   English   中英

如何正確緩存我的Symfony2 API?

[英]How to properly cache my Symfony2 APIs?

我在Symfony2上制作經典的無狀態RESTfull API:用戶/應用程序在身份驗證API上獲取身份驗證令牌,並將其提供給所有其他要記錄的API,並在其他API上發布數據/訪問受保護/私有/個人數據。

我現在有三個關於此工作流程和緩存的問題:

  • 如何為我的“靜態”API(始終提供相同的內容,無論記錄的用戶及其令牌)使用HTTP緩存,假設不同的用戶為同一個API在url中傳遞不同的令牌,以便url會永遠不一樣? 那么如何使用HTTP共享緩存呢?

  • 對於記錄的用戶權限(我基本上有4種不同的權限級別),我有相同URL的API生成不同的輸出。 問題是:這是一個好模式嗎? 擁有4個不同的網址,每個網址對應一個,我可以緩存,這不是更好嗎? 如果沒有,如何實現適當的緩存?

  • 共享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. 在實例化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請求並不意味着在請求之間進行更改。 因此,如果內容根據登錄用戶進行更改,則應將響應設置為private並防止對反向代理緩存進行緩存。

如果速度需要緩存,則應在內部處理,而不是由反向代理處理

因為我們不想基於每個用戶角色引入URL,所以我們只是在內部緩存響應(使用Redis)並直接返回它而不是讓緩存(mis)處理它。

至於你的第三點,因為HTTP和HTTPS流量達到相同的緩存並且響應具有明確設置的公共/私有和緩存控制設置,所以AppCache正在為安全和不安全的流量提供相同的響應。

我希望這對我有所幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM