2012-07-17 46 views
0

我有一個應用程序,通過谷歌地圖api(距離矩陣和地圖API)使用地理定位來計算距離並在地圖上顯示引腳。我的邏輯存在性能問題(我的數據庫中有100個地址,我全部抓住它們,將所有距離矩陣運行並獲得距離)我每次用戶點擊時都會這樣做更新位置按鈕。但是這種方法有一個問題,每次刷新按鈕被點擊時,我會發出100個請求,並且它只針對1個用戶。顯然有時候,API豐富了每天請求的限制。我的問題是:如何獲得更好的性能並改善我的邏輯,以便此應用更快運行並且不會達到每日請求限制?我有大約1000人使用這個應用程序。谷歌地圖API請求性能問題

這裏是我的代碼:

<?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

你能使用緩存來減少請求的數量?

我之前做過的事情是,當我達到谷歌API請求的限制並回退到雅虎之類的其他服務時。

我不知道如果雅虎具有相同的功能,但它可能是值得探討

0

這是非常相似的Rafael Fragoso's question here和我的答案在這裏有適用。正如Andrew所說,你可以暫時緩存它(因此一個用戶的地址可以暫時存儲 - 這對符合TOS很重要),以便其他用戶在接下來的一小時或幾分鐘或其他時間需要該地址。

然而,一個更好,更強大的解決方案是找到一個提升查詢限制並且更持久的API。請參閱我的鏈接答案,以獲得啓動的建議。

0

我不知道我明白你爲什麼反覆查找緯度/經度。將地圖查找添加到用於添加/編輯地址的接口並將lat/lng直接存儲在數據庫中會容易得多。在編輯地址時,通過顯示Google地圖的Web瀏覽器進行操作,並使用JavaScript將lat/lng推入隱藏字段,然後將其發佈回服務器端腳本,以便將它們放入數據庫中。

然後當你需要引腳數據時,你可以直接從數據庫中取出它。您的代碼運行速度會更快,您只需觸摸100次地址的100次地址的API,而不是每次使用100次。

在JavaScript中運行腳本客戶端時,您不會遇到限制,除非可能在批處理中運行這些限制時達到10 /秒吞吐量限制,但如果一次只執行一次,則不適用。