2010-12-29 4 views
2

Google지도에 HTTP 역 지오 코딩 (위도, 경도 -> 주소) 요청을하려면 PHP와 CURL을 사용하고 있습니다. 프리미어 계정을 보유하고 있으므로 제한되거나 차단되지 않고 많은 요청을 할 수 있습니다.PHP 컬 성능 병목 Google Maps 지오 코딩 요청하기

아쉽게도 성능 제한에 도달했습니다. 리버스 지오 코딩해야하는 일일 약 50 만 건의 요청이 매일 발생합니다.

코드는 시간과 공간을 절약하기 위해 매우 단순합니다 (의사 코드로 조각을 쓸 것입니다). 다음 코드 단편은 작업을 통해 매 15 초마다 호출됩니다.

<?php 
    //get requests from database 
    $requests = get_requests(); 

    foreach($requests as $request) { 
     //build up the url string to send to google 
     $url = build_url_string($request->latitude, $request->longitude); 

     //make the curl request 
     $response = Curl::get($url); 

     //write the response address back to the database 
     write_response($response); 
    } 

    class Curl { 
      public static function get($p_url, $p_timeout = 5) { 
       $curl_handle = curl_init(); 
       curl_setopt($curl_handle, CURLOPT_URL, $p_url); 
       curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, $p_timeout); 
       curl_setopt($curl_handle, CURLOPT_TIMEOUT, $p_timeout); 
       curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1); 

       $response = curl_exec($curl_handle); 
       curl_close($curl_handle); 

       return $response; 
      } 
    } 
?> 

성능 문제는 CURL 요청 인 것 같습니다. 그것들은 모든 작업을 HTTP 요청으로 처리하기 때문에 매우 느립니다. 우리는 100mbps 연결을 가지고 있지만, 최고 속도로 실행되는 스크립트는 약 1mbps만을 사용합니다. 서버의 부하는 본질적으로 아무 것도 아닙니다. 이 서버는 8GB의 메모리를 갖춘 쿼드 코어입니다.

처리량을 높이려면 어떻게해야합니까? Google지도에서 지속적 (지속) HTTP 요청을 여는 방법이 있습니까? 수평으로 작업을 폭발시키는 즉 50 개의 동시 요청을 만드는 방법은 어떨까요?

감사합니다.

+0

희망 하시겠습니까? Curl은 연결 유지 요청을 수행 할 수 있습니다. 컬 문서를 검색해야하는 한 가지는 HTTP 파이프 라이닝입니다. 파이프 라이닝은 HTTP/1.1 프로토콜의 추가 사항이며 문제 해결에 만 사용됩니다. HTTP keepalive 세션을 사용하는 대신 요청 그룹별로 요청을 보내고 그룹별로 결과를 얻을 수도 있습니다. libcurl은 HTTP 파이프 라이닝을 지원합니다. Google지도 서버가 파이프 라인을 허용하고 경로에서 너무 많은 이상한 프록시가 아닌 GET 요청 만 있으면 많은 수의사를 얻을 수 있습니다. – regilero

답변

1

몇 가지 내가 할 수 없을 것입니다 :

  • 을 상관없이 당신이 얼마나 "프리미엄"항상 병목 현상이 될 것이다 외부 HTTP-요청을하고, 우선, 캐시 요청 + 응답 - 그래서 당신은 여전히 ​​업데이트 할 수 있습니다 그들은 정기적으로 cron을 통해.

  • 이것은 단일 HTTP 요청입니다. 특히 요청 및 응답이 작은 (tcp/handshaking/headers/etc) 경우에는 "fullspeed"를 얻을 수 없습니다. 그래서 (보험료가 허용하는 경우) 여러 요청을 시작하기 위해 multicurl를 사용해보십시오 - 이것은 당신이 fullspeed 제공한다)

  • 추가를 "연결을 닫기"당신이 보내는 요청 헤더에이 즉시 HTTP를 닫습니다 연결이 당신과 구글의 서버 있도록 모든 요청을 여러 시스템이나 프로세스에 작업을 나누어 조사한다 순차적으로 실행중인 고려 halfopen

+0

http://www.php.net/manual/en/function.curl-multi-init.php – Cymbals

0

와 망치되지 않습니다. 그런 다음 각각을 병렬로 실행할 수 있습니다. 벤치마킹으로 판단 할 때 CPU 또는 대역폭이 아닌 각 Curl 응답 속도가 제한적입니다.

내 첫 번째 추측은 너무 대기열 시스템 (Gearman, RabbitMQ)입니다.