
使用 API 檢索大量資料(可能有數千個專案)時,需要考慮幾個關鍵方面,以確保流程高效、靈活且高效能。以下是需要管理的關鍵因素的細分,以及針對 PHP 使用者的解決方案。
透過 API 檢索大數據時的關鍵注意事項
讓我分享一些透過 API 高效檢索大型資料集的關鍵注意事項:
-
處理分頁:API 通常在頁面中傳遞資料。要檢索所有數據,您需要管理分頁,執行多個 API 呼叫,同時追蹤遊標或頁碼。計算所需的 API 呼叫數量並管理此過程對於確保您獲得完整的資料集至關重要。
-
記憶體管理:在獲取大型資料集時,將所有內容一次性載入記憶體可能會壓垮您的系統。避免同時將所有結果載入記憶體至關重要。相反,分塊處理數據,確保您的應用程式保持響應並且不會遇到記憶體問題。
-
速率限制和節流:許多 API 都會施加速率限制,例如限制每秒 X 個請求或每分鐘 Y 個請求。為了保持在這些限制之內,您必須實現靈活的限制機制,以適應 API 的特定限制。
-
並行API請求:考慮到分頁需要執行大量API調用,您希望盡快檢索資料。一種策略是並行進行多個 API 調用,同時遵守速率限制。這可確保您的請求既快速又符合 API 限制。
-
高效資料收集:儘管發出了大量分頁 API 請求,您仍需要將結果合併到一個集合中,有效地處理它們以避免記憶體過載。這確保了數據的順利處理,同時保持較低的資源使用率。
-
優化JSON解析:很多API回傳JSON格式的資料。處理大型回應時,以高效能方式存取和查詢 JSON 的特定部分非常重要,確保不會載入或處理不必要的資料。
-
高效的異常處理:API 通常透過 HTTP 狀態碼引發異常,指示逾時、未經授權的存取或伺服器錯誤等問題。使用程式語言提供的異常機制來處理這些問題非常重要。除了基本的錯誤處理之外,您還應該以與應用程式邏輯一致的方式映射和引發異常,從而使錯誤處理過程清晰且易於管理。實作重試、記錄並將錯誤對應到有意義的異常可確保資料檢索過程順利可靠。
“惰性 JSON 頁面”PHP 解決方案
如果您正在使用 PHP,那麼您很幸運。 Lazy JSON Pages 開源套件提供了一個方便的、與框架無關的 API 抓取器,可以透過非同步 HTTP 請求將分頁 JSON API 中的項目載入到 Laravel 惰性集合中。該套件簡化了分頁、限制、並行請求和記憶體管理,確保效率和效能。
您可以在官方 GitHub 存儲庫的自述文件中找到有關該包的更多信息,以及用於自定義它的更多選項:Lazy JSON Pages。
我想對軟體包的作者 Andrea Marco Sartori 表示感謝。
範例:從 Storyblok 檢索數千個故事
這是一個使用 PHP 中的 Lazy JSON Pages 套件從 Storyblok 檢索數千個故事的簡明範例。
首先,你可以建立一個新目錄,跳到該目錄並開始安裝套件:
mkdir lazy-http
cd lazy-http
composer require cerbero/lazy-json-pages
安裝套件後,您可以開始建立腳本:
totalItems('total')
->async(requests: 3)
->throttle(requests: 10, perSeconds: 1)
->collect('stories.*');
foreach ($lazyCollection as $item) {
echo $item["name"] . PHP_EOL;
}
然後您可以替換您的存取令牌,並透過php命令執行腳本。
它是如何運作的
-
高效分頁:API結果分頁,惰性集合處理取得所有頁面,而不需要將所有內容儲存在記憶體中。
-
非同步 API 呼叫:->async(requests: 3) 行並行觸發三個 API 請求,從而提高效能。
-
Throtdling:->throttle(requests: 10, perSeconds: 1) 行確保每秒發出的請求不超過 10 個,遵守速率限制。
-
記憶體效率:使用惰性集合可以逐項處理數據,從而減少記憶體開銷,即使對於大型資料集也是如此。
此方法提供了可靠、高效且記憶體高效的解決方案,用於從 PHP 中的 API 檢索大量資料。
參考
- Lazy JSON Pages 套件:https://github.com/cerbero90/lazy-json-pages
- 開源套件作者:https://github.com/cerbero90