0

我有一个应用程序,它通过谷歌地图 api(距离矩阵和地图 API)使用地理定位来计算距离并在地图上显示图钉。我的逻辑存在性能问题(我的数据库中有 100 个地址,我将它们全部抓取,我将所有地址都放入距离矩阵并获取我所在位置的距离)每次用户点击时我都会这样做更新位置按钮。但是该方法有一个问题,每次单击刷新按钮时我都会发出 100 个请求,并且仅适用于 1 个用户。显然,有时 API 会限制每天的请求数。我的问题是:我怎样才能获得更好的性能并改进我的逻辑,让这个应用程序运行得更快并且不达到每日请求限制?我有大约 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

这与Rafael Fragoso 的问题非常相似,我的回答也适用于此处。正如安德鲁所说,您可以暂时缓存它(因此可以暂时存储由一个用户进行地理编码的地址- 这对于符合 TOS 很重要),以供其他用户在接下来的一小时或几分钟或任何时间内需要该地址。

然而,一个更好、更健壮的解决方案是找到一个可以提升查询限制并且更永久的 API。请参阅我的链接答案以获取帮助您入门的建议。

于 2012-07-17T20:24:38.667 回答
0

你可以使用缓存来减少请求的数量吗?

另外,我过去做过的事情是,当我达到谷歌 API 请求的限制并回退到其他服务(如 Yahoo 或其他服务)时。

我不确定雅虎是否具有相同的功能,但可能值得研究

于 2012-07-17T18:57:06.037 回答
0

我不确定我是否理解您为什么要反复查找 lat/lng。将地图查找添加到用于添加/编辑地址并将纬度/经度直接存储在数据库中的界面会容易得多。当您编辑地址时,请通过显示 Google 地图的 Web 浏览器执行此操作,并使用 JavaScript 将 lat/lng 推送到隐藏字段中,然后将其发布回服务器端脚本,该脚本可以将它们放入数据库中。

然后,当您需要引脚数据时,您可以直接从数据库中提取它。您的代码将运行得更快,对于 100 个地址,您只需触摸 API 100 次,而不是每次使用 100 次。

在 JavaScript 中运行脚本客户端,您不会遇到限制,如果您批量运行它们可能会达到 10/秒的吞吐量限制,但如果您一次执行一个,则不适用。

于 2013-07-17T19:57:41.943 回答