2

foreach() ループと Google Maps API クラスに大きな問題があります。

現在、MySQL テーブルに 1500 個のデータセットがあり、「latitude IS NULL」で並べ替えています。次に、それらを foreach() して、毎回 Google Maps API (KM6_Geo) を呼び出し、新しいジオコードを MySQL データベースに保存します。

BUT: 約 250/300 回の呼び出し / 更新の後、サーバーが「タイムアウト」で応答します。

これが私の現在のスクリプトです:

    foreach(KM6_Addresses::getGeoCodes() as $item):

        $geocode = KM6_Geo::generate($item['street'].' '.$item['zipcode'].' '.$item['city']);
        $data = 配列(
            'lat' => $geocode['lat'],
            'lng' => $geocode['lon']

        );

        $where = array('company_id' => $item['company_id']);        
        KM6_Addresses::updateGeoCode($data,$where);
    endforeach;

今私の質問: パッケージなどで foreach() を使用するにはどうすればよいですか。だから私は1500のデータセットを更新しようとしません。

多分誰かが私を助けることができます。

ありがとう!;)

4

1 に答える 1

1

API クォータに達しているようです。

これは、特定の日に同じ IP からのリクエストが多すぎるか、一定期間に多すぎる場合に発生します。

私は次のことを見ていきます。

50 ~ 100 データセットごとに一時停止を実装して、最初のクォータ セットに役立つかどうかを確認してください。

もう 1 つは、より高いクォータを持つ可能性がある API プレミアを確認することです。

同じ行の別の応答については、これを確認してください。

- 編集 -

その時、私はこれに出くわしました。

ステータス コードを取得できる場合、TOO_MANY_Queries を取得すると、Python コードで 2.0 秒の遅延が実行されているように見えます。

おそらく、各 ForEach の間に 2 秒の遅延を適用するか、制限に達するまでループし、sleep(2) してから再開して、それが機能するかどうかを確認するようなことを検討しています。

ここで重要なことは、ブラック リストに載せられたくないということです。1500 をすべて 10 ~ 30 秒で実行する必要がありますか? または、それぞれの間に 2 秒の遅延を実装すると、3000 秒になるか、コードが 50 分で完了すると、その 24 時間のクォータにまだ 1,000 の呼び出しが残っていることになります。

24 時間で 2500 の制限に近づかないように、セーフガードを組み込むことを強くお勧めします。

于 2012-12-19T18:05:12.520 に答える