2010-12-29 7 views
2

GoogleマップへのHTTP逆ジオコーディング(緯度、経度 - >アドレス)リクエストを作成するのにPHPとCURLを使用しています。私はプレミアアカウントを持っているので、スロットルやブロックせずにたくさんのリクエストを行うことができます。PHPカールパフォーマンスのボトルネックGoogleマップのジオコーディングリクエストを作成する

残念ながら、パフォーマンスの上限に達しました。逆ジオコーディングが必要な毎日約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キープアライブセッションを使用するのではなく、要求のグループごとにリクエストを送信し、グループごとに結果を取得します。 libcurlはHTTPパイプライニングをサポートしています。 Googleマップサーバーがあなたからのパイプラインを許可していて、GET要求しかなく、パス内に奇妙なプロキシがあまりない場合は、多くのperfsを得ることができます。 – regilero

答えて

1

私はどうしたらいくつか:キャッシュ要求+応答、初心者のためのよう

  • 関係なく、あなたはどのように「プレミアム」、外部のhttp-要求を行うことは、常に、ボトルネックになりません - あなたはまだ更新することができますそれらはcron経由で定期的に受け取ります。

  • これらは単一のhttp要求です。要求と応答が小さければ(特に、< 1MB) - TCP /ハンドシェイク/ヘッダー/ etc。 複数のリクエストを開始するにはマルチコールを使用してください(複数のリクエストを開始するにはフルスピードが必要です)

  • あなたが送信するリクエストヘッダーに「接続:閉じる」を追加するとすぐにhttpが閉じます接続あなたとGoogleのサーバーが順番にすべてのあなたの要求を実行している複数のマシンやプロセスに作業を分割になっているはずです考慮halfopen

+0

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

0

を打たないようにします。その後、それぞれを並列に実行することができます。ベンチマークで判断すると、CPUや帯域幅ではなく、各Curlレスポンスの速さによって制限されます。

私の最初の推測はあまりにも待ち行列システム(Gearman,RabbitMQ)を見ています。

関連する問題