ローカル データベースへの API 同期: 一度に n レコードを更新しますか? – PHP – SitePoint フォーラム

サードパーティ API 経由で利用できる在庫を同期する Web アプリに取り組んでいます。

すべてのレコード (約 10,000 件) をローカル データベースに移動する必要があり (1 回だけ)、過去 24 時間に変更されたすべてのレコードを毎日 (約 500 件) 更新する必要があります。

API は、呼び出しごとに最大 250 レコードのみを返します。

これらのレコードを一度に 250 ずつループして、ローカル データベースに追加/更新するにはどうすればよいですか?


API はどのような形式でそれらを返しますか? 同様のことを行ったところ、JSON 形式で返されたので、JSON をデコードして個々のオブジェクトをループするだけです。 あなたの API はそれらを XML で返すかもしれませんが、その場合は似ていると思います。

これは少し広範囲にわたる質問であり、特に PHP とは関係ありません。

入力していただきありがとうございます。 データは JSON で返されます。

私は、250 (サードパーティ API で一度に取得できるレコードの最大数) のチャンクで同期を処理するために何をする必要があるかについて、より心配しています。

おそらく、250 レコードの各ブロックを取得するときに、ページ番号のようなものを指定する必要があるでしょうか? それとも、すべてを要求して複数の応答を取得し、それぞれに 250 レコードが含まれていますか? それとも、すべてを要求して最初の 250 を取得しますか?

SKU などで注文され、API で許可されている場合、各リクエストは、SKU が前回の SKU よりも大きいすべての製品に対して行われる可能性があります。 擬似コード:

lastSKU=""
rows = getproducts (where SKU > lastSKU)  // returns first 250 products
while count(rows) > 0
  parse rows into your database
  lastSKU = the last SKU in "rows"
  rows = getproducts(where SKU > lastSKU)  // returns next 250 products
end while

ページ番号で取得する必要がある場合、同じ種類のアイデア – ページ 1 を取得し、ページ番号をインクリメントして次のページを取得し、取得するレコードが 250 未満になるまで、それがおそらく最後のページです。

一度に 250 件のレコードをループして、ローカル データベースに追加/更新する方法の 1 つを次に示します。

まず、API で使用できるレコードの総数を取得する必要があります。 これを行うには、API を呼び出し、応答の「total」または「count」フィールドの値を確認します。

次に、ループを使用して 250 のチャンクでレコードを取得できます。これを行うには、API 呼び出しを行い、毎回「オフセット」または「ページ」パラメーターをインクリメントします。 たとえば、最初の 250 レコードを取得するには、オフセットを 0 に設定します。次の 250 レコードを取得するには、オフセットを 250 に設定します。

$offset = 0;
$limit = 250;
while ($offset < $total_records) {
    $response = make_api_call($offset, $limit);
    // Add/update the records in the local database
    $offset += $limit;
}

ループ内で、応答を解析し、ローカル データベースのレコードを追加/更新できます。 追加/更新には、ORM (オブジェクト リレーショナル マッピング) または任意のクエリ ビルダーを使用できます。

最初のデータ フェッチの後、同じロジックを使用して毎日 API からデータをフェッチできますが、今回は最終更新日に基づいてデータをフィルター処理する必要があります。

API からのレート制限を回避するために、各 API 呼び出しの間にスリープ時間を追加することもできます。

レコードの変更率によっては、Webhook を使用してレコードが変更されたときに通知を取得するなど、別のアプローチを使用する方がよい場合があることに注意することが重要です。 これにより、すべてのレコードを取得してそれらを比較してどのレコードが変更されたかを確認するのではなく、変更されたレコードのみを更新できます。

別の可能な解決策は、ページネーション手法を使用して、250 のチャンクでレコードを取得することです。これを実装する方法の例を次に示します。

  1. 最初に、すべてのレコードを取得するために必要な合計ページ数を決定します。 これを行うには、レコードの総数を 1 ページあたりのレコード数 (250) で割ります。
  2. ページを反復処理するループを開始します。 各反復で、そのページのレコードを取得する API 呼び出しを行います。
  3. 取得したレコードのセットごとに、それらをループして、レコードがローカル データベースに既に存在するかどうかを確認します。 その場合は、レコードを更新します。 そうでない場合は、レコードをローカル データベースに追加します。
  4. すべてのレコードが取得され、ローカル データベースで追加/更新されるまで、手順 2 と 3 を繰り返します。

コードが PHP でどのように表示されるかの例を次に示します。

を交換する必要があります。 get_records_from_api()get_record_from_database()update_record_in_database()、 と add_record_to_database() API およびローカル データベースと通信する独自​​のコードで機能します。

これは問題を解決する 1 つの方法にすぎないことに注意してください。API とローカル データベースの仕様に応じて、コードを調整する必要がある場合があります。

Leave a Comment

Your email address will not be published. Required fields are marked *