API を使用して膨大な量のデータ (場合によっては数千のアイテム) を取得する場合、プロセスの効率性、柔軟性、パフォーマンスを確保するために考慮すべき重要な側面がいくつかあります。ここでは、管理すべき主な要素の内訳と、PHP ユーザー向けの解決策を示します。
API 経由で大規模なデータを取得する場合の重要な考慮事項
API 経由で大規模なデータセットを効率的に取得するための重要な考慮事項をいくつか紹介します。
-
ページネーションの処理: API は通常、データをページに配信します。すべてのデータを取得するには、カーソルまたはページ番号を追跡しながら複数の API 呼び出しを実行して、ページネーションを管理する必要があります。完全なデータセットを確実に取得するには、必要な API 呼び出しの数を計算し、このプロセスを管理することが不可欠です。
-
メモリ管理: 大規模なデータセットをフェッチする場合、すべてを一度にメモリにロードするとシステムに負荷がかかる可能性があります。すべての結果を同時にメモリにロードしないようにすることが重要です。代わりに、データをチャンクに分けて処理し、アプリケーションの応答性を維持し、メモリの問題が発生しないようにします。
-
レート制限とスロットリング: 多くの API では、1 秒あたり X リクエストまたは 1 分あたり Y リクエストに制限するなど、レート制限が課されます。これらの制限内に収まるようにするには、API の特定の制限に適応する柔軟なスロットル メカニズムを実装する必要があります。
-
並列 API リクエスト: ページネーションにより多数の API 呼び出しを実行する必要があるため、できるだけ早くデータを取得する必要があります。 1 つの戦略は、レート制限を遵守しながら複数の API 呼び出しを並行して行うことです。これにより、リクエストが高速かつ API 制約に準拠することが保証されます。
-
効率的なデータ収集: 多数のページ分割された API リクエストを作成しても、結果を 1 つのコレクションに結合し、メモリの過負荷を避けるために効率的に処理する必要があります。これにより、リソースの使用量を低く抑えながら、データのスムーズな処理が保証されます。
-
最適化された JSON 解析: 多くの API はデータを JSON 形式で返します。大規模な応答を処理する場合は、JSON の特定のセクションに効率的にアクセスしてクエリを実行し、不要なデータが読み込まれたり処理されたりしないようにすることが重要です。
-
効率的な例外処理: API は通常、HTTP ステータス コードを通じて例外を発生させ、タイムアウト、不正アクセス、サーバー エラーなどの問題を示します。プログラミング言語が提供する例外メカニズムを使用してこれらを処理することが重要です。基本的なエラー処理に加えて、アプリケーションのロジックと一致する方法で例外をマップして発生させ、エラー処理プロセスを明確で管理しやすくする必要もあります。再試行、ログ記録、およびエラーを意味のある例外にマッピングすることにより、スムーズで信頼性の高いデータ取得プロセスが保証されます。
「Lazy JSON Pages」PHP ソリューション
PHP を使用している場合は、幸運です。 Lazy JSON Pages オープンソース パッケージは、非同期 HTTP リクエストを介して、ページ分割された JSON API から Laravel 遅延コレクションに項目をロードできる、フレームワークに依存しない便利な API スクレーパーを提供します。このパッケージは、ページネーション、スロットル、並列リクエスト、メモリ管理を簡素化し、効率とパフォーマンスを保証します。
パッケージの詳細と、パッケージをカスタマイズするためのその他のオプションについては、公式 GitHub リポジトリ: Lazy JSON Pages の Readme を参照してください。
パッケージの作者である Andrea Marco Sartori に感謝の意を表したいと思います。
例: Storyblok から数千のストーリーを取得する
これは、PHP の Lazy JSON Pages パッケージを使用して Storyblok から数千のストーリーを取得する簡潔な例です。
まず、新しいディレクトリを作成し、そのディレクトリに移動して、パッケージのインストールを開始します。
mkdir lazy-http
cd lazy-http
composer require cerbero/lazy-json-pages
パッケージがインストールされたら、スクリプトの作成を開始できます。
<?php
require "./vendor/autoload.php";
use Illuminate\Support\LazyCollection;
$token = "your-storyblok-access-token";
$version = "draft"; // draft or published
$source = "https://api.storyblok.com/v2/cdn/stories?token=" . $token . "&version=" . $version;
$lazyCollection = LazyCollection::fromJsonPages($source)
->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) 行は 3 つの API リクエストを並行してトリガーし、パフォーマンスを向上させます。
-
スロットル: ->throttle(requests: 10, perSeconds: 1) 行は、レート制限を遵守しながら、1 秒あたり 10 件を超えるリクエストが行われないようにします。
-
メモリ効率: 遅延コレクションを使用すると、大規模なデータセットであってもデータを項目ごとに処理できるため、メモリのオーバーヘッドが削減されます。
このアプローチは、PHP の API から大量のデータを取得するための信頼性が高く、パフォーマンスが高く、メモリ効率の高いソリューションを提供します。
参考文献
- Lazy JSON Pages パッケージ: https://github.com/cerbero90/lazy-json-pages
- オープンソース パッケージの作成者: https://github.com/cerbero90
以上が大規模な API データ取得の最適化: ベスト プラクティスと PHP 遅延コレクション ソリューションの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。