0

Google Maps API ( Distance Matrix and Maps API ) を介して地理位置情報を使用して距離を計算し、地図上にピンを表示するアプリがあります。ロジックでパフォーマンスの問題が発生しています (データベースに 100 個の住所があり、それらすべてを取得し、すべてを距離マトリックスに実行して、現在地の距離を取得します) ユーザーがクリックするたびにこれを実行しています場所の更新ボタン。しかし、その方法には問題があります。更新ボタンがクリックされるたびに 100 のリクエストを行っており、1 人のユーザーに対してのみです。明らかに、API が 1 日あたりのリクエスト数の上限を超えることがあります。私の質問は次のとおりです。このアプリのパフォーマンスを向上させ、ロジックを改善して高速に実行し、1 日の要求制限に達しないようにするにはどうすればよいですか? 約1000人がこのアプリを使用しています。

これが私のコードです:

<?php
header('Content-Type: application/json');

// Open the connection with the database
$conn = mysql_connect('localhost', 'gennovacap', 'coupons');
mysql_select_db('coupons', $conn);

$id_voucher = $_POST['id_voucher'];
$uuid = $_POST['uuid'];
// $uuid = "1343C38F-C0F3-4D86-B763-C14CFBF1DAC3";
// $id_voucher = 8;


$q = mysql_query("SELECT * FROM vouchers WHERE id_voucher = ".$id_voucher);
$voucher = mysql_fetch_assoc($q);

if(preg_match('/[\+]{2}+/', $voucher['address'])) {
    $i = 0;
    foreach(explode('++', $voucher['address']) as $address){

        $address = preg_replace('/\s/m', '+', $address);
        $request = "http://maps.googleapis.com/maps/api/geocode/xml?address=".$address."&sensor=true";
        $result = simplexml_load_file($request);

        $latitude = $result->result->geometry->location[0]->lat;
        $longitude = $result->result->geometry->location[0]->lng;

        $json['markers'][$i]['latitude'] = $latitude;
        $json['markers'][$i]['longitude'] = $longitude;
        $json['markers'][$i]['titlev'] = $voucher['name'];

        $i++;
    }

} else {
    
    $address = preg_replace('/\s/m', '+', $voucher['address']);
    $request = "http://maps.googleapis.com/maps/api/geocode/xml?address=".$address."&sensor=true";
    $result = simplexml_load_file($request);

    $latitude = $result->result->geometry->location[0]->lat;
    $longitude = $result->result->geometry->location[0]->lng;

    $json['markers'][0]['latitude'] = $latitude[0];
    $json['markers'][0]['longitude'] = $longitude[0];
    $json['markers'][0]['titlev'] = $voucher['name'];

}

// See if the user redeemed this coupon
$redemption = mysql_query("SELECT * FROM redemptions WHERE uuid = '".$uuid."' AND id_voucher = '".$id_voucher."'");
$count = mysql_num_rows($redemption);
if($count > 0) {
    $created_at = mysql_fetch_row($redemption);
    $json['titlev'] = $voucher['name'];
    $json['deal'] = $voucher['deal'];
    $json['redemptions'] = false;
    $json['redemptions_text'] = $created_at[3];
} else {
    $json['titlev'] = $voucher['name'];
    $json['deal'] = $voucher['deal'];
    $json['redemptions'] = true;
    $json['redemptions_text'] = "Redeem This Coupon";
}

print json_encode($json);
4

3 に答える 3

0

キャッシュを使用してリクエストの数を減らすことはできますか?

また、私が過去に行ったことは、Google API リクエストの制限に達し、Yahoo などの別のサービスにフォールバックしたときです。

Yahooに同じ機能があるかどうかはわかりませんが、調べる価値があるかもしれません

于 2012-07-17T18:57:06.037 に答える
0

これは、ここでの Rafael Fragoso の質問と非常によく似ており、そこでの私の回答がここに当てはまります。アンドリューが言ったように、次の1時間または数分または何かでそのアドレスを必要とする他のユーザーのために、一時的にキャッシュすることができます(したがって、あるユーザーによってジオコーディングされたアドレスを一時的に保存できます-TOSに準拠するために重要です).

ただし、はるかに優れた堅牢なソリューションは、クエリの制限を解除し、より永続的な API を見つけることです。開始するための提案については、リンクされた回答を参照してください。

于 2012-07-17T20:24:38.667 に答える