我有一个应用程序通过谷歌地图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);
答案 0 :(得分:0)
您是否可以使用缓存来减少请求数量?
我过去所做的事情是,当我达到谷歌API请求的限制并回退到雅虎等其他服务时。
我不确定雅虎是否具有相同的功能,但可能值得研究
答案 1 :(得分:0)
这与Rafael Fragoso's question here非常相似,我的答案在这里适用。正如安德鲁所说,你可以暂时缓存它(因此一个用户地理编码的地址可以存储暂时 - 这对于符合TOS很重要),以便在接下来的一小时或几分钟内需要该地址的其他用户或者其他什么。
然而,更好,更强大的解决方案是找到一个提升查询限制的API,并且更加永久。请参阅我的链接答案,了解有关帮助您入门的建议。
答案 2 :(得分:0)
我不确定我理解你为什么反复查找lat / lng。将地图查找添加到用于添加/编辑地址并将lat / lng直接存储在数据库中的界面会更容易。编辑地址时,请通过显示Google地图的Web浏览器执行此操作,并使用JavaScript将lat / lng推送到隐藏字段,然后将其发布回服务器端脚本,以便将其放入数据库。
然后,当您需要引脚数据时,可以直接从数据库中提取引脚数据。您的代码运行得更快,您只需要100次触摸API 100次,而不是每次使用100次。
在JavaScript中运行脚本客户端,你不会达到限制,除非你批量运行这些限制,否则可能是10 /秒的吞吐量限制,但是如果你一次只执行一次,则不适用。 / p>