2012-07-17 3 views
0

Google지도 api (거리 매트릭스 및지도 API)를 통해 geolocation을 사용하여지도에서 거리를 계산하고 핀을 표시하는 앱이 있습니다. 내 논리에 성능 문제가 있습니다. (데이터베이스에 100 개의 주소가 있으며, 모두 가져오고, 거리 매트릭스에 모두 들어가서 내 위치에 대한 거리를 얻습니다.) 사용자가 클릭 할 때마다이 작업을 수행하고 있습니다. 위치 업데이트 버튼. 하지만 그 방법에 관한 이야기가 있습니다. 새로 고침 버튼을 클릭 할 때마다 100 개의 요청을하고 있는데, 이는 단지 1 명의 사용자를위한 것입니다. 분명히 API가 하루에 요청을 제한하는 경우가 있습니다. 내 질문입니다 : 어떻게하면 더 나은 성능을 얻을 수 있으며,이 응용 프로그램이 더 빨리 실행되고 일일 요청 한도에 도달하지 못하는 내 논리를 향상시킬 수 있습니까? 이 앱을 사용하는 약 1000 명의 사람들이 있습니다.Google지도 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

당신이 요청의 수를 줄이기 위해 캐싱을 사용할 수 있습니다 여기에

내 코드?

또한 내가 과거에 한 일은 Google API 요청의 한계에 부딪쳤을 때 야후 또는 다른 서비스와 같은 다른 서비스로 전환하는 것입니다. 야후 같은 기능이있는 경우

는 잘 모르겠어요하지만

0

Rafael Fragoso's question here 매우 유사하다 내 대답은 여기에있다 적용을 조사 가치가있을 수도 있습니다. Andrew가 말했듯이 일시적으로 캐시 할 수 있습니다 (따라서 한 사용자가 지오 코딩 한 주소는 다음 시간 또는 몇 분 내에 주소가 필요한 다른 사용자의 경우 - TOS 준수에 중요합니다).

그러나 훨씬 강력하고 나은 솔루션은 쿼리 제한을 해제하고 더 영구적 인 API를 찾는 것입니다. 당신의 시작을위한 제안에 대한 내 연결된 답변을 참조하십시오.

0

위도/경도를 반복적으로 왜보고 있는지 잘 모르겠습니다. 주소를 추가/편집하고 위도/경도를 데이터베이스에 직접 저장하는 데 사용하는 인터페이스에지도 조회를 추가하는 것이 훨씬 쉽습니다. 주소를 편집 할 때는 Google지도를 표시하는 웹 브라우저에서 JavaScript를 사용하여 위도/경도를 숨겨진 필드로 밀어 넣은 후 숨겨진 필드로 가져 와서 데이터베이스에 넣을 수있는 서버 측 스크립트에 다시 게시하십시오.

그러면 핀 데이터가 필요할 때 db에서 직접 가져올 수 있습니다. 코드가 훨씬 빨리 실행되므로 사용 당 100 회가 아닌 100 회에 대해 총 100 회 API 만 터치해야합니다.

스크립트에서 클라이언트 측 스크립트를 실행하면 일괄 적으로 실행하면 10 초 처리량 제한을 제외하고는 한도에 도달하지 않지만 한 번에 하나씩 수행하면 적용되지 않습니다.