2017-10-17 9 views
0

私は5550レコードの異なるルートを持っているので、各レコードに対してforeachループを実行してAPIデータを取得する必要があります。 は、だから私はLaravelにがつがつ食うと機能を作った:私はGoogleマップから距離データをロードしてデータベースに保存する必要があります

public function getDirectionDistance($origins, $distinations) 
{ 
    $client = new Client(); 
    $res = $client->get("https://maps.googleapis.com/maps/api/distancematrix/json?origins=$origins&destinations=$distinations&key=ччч")->getBody()->getContents(); 
    $obj = json_decode($res, true); 
    $distance = $obj['rows'][0]['elements'][0]['distance']['text']; 
    $clean = $string = str_replace(' km', '', $distance); 
    return $clean; 

} 

私は店の方法

public function store() 
{ 
    $route = $this->route->with('from','to')->get(); 
    $maps = new Maps(); 

    foreach ($route as $item){ 

     $direction = new Direction(); 
     $from = $item->from->name; 
     $to = $item->to->name; 
     $direction->route_id = $item->id; 
     $direction->distance = $maps->getMapsApi("$from,israel","$to,israel"); 
     $direction->save(); 
     sleep(3); 

    } 

} 

でそれを使用しかし、私はそれを行うとき、私は200本のルートの1人の距離を取得し、200行の後私は次のルートの次の距離を取得します。停止し、APIが完了するのを待って、それを保存し、次の行を開始する方法。機械学習の価格計算機を作成するためのデータが必要です。私はこのように仕事のために

+0

何をしますか?一度に5500のレコードをすべて保存しますか? – Vikash

+0

はい、route_idで距離を保存し、ルートの関係を作成します。 –

+0

chunckでデータを分割してすべてのデータを一度に保存することができます。小さなchunckで分割して保存します – Vikash

答えて

0

public function insertStatic($origins, $destination, $m){ 
     $arrayInsert = array('origins'=>$origins, 'destination'=>$destination,'distance'=>$m); 
     Self::create($arrayInsert); 
    } 

そして中:私のモデル内の関数のようなものである

public function calculateDistance($origins, $destination){ 
    $staticDistanceModel = New StaticDistance(); 
    $url = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=" . $origins . "&destinations=" . $destination . "&mode=driving&language=it-IT&key=xyz"; 
      $ch = curl_init(); 
      curl_setopt($ch, CURLOPT_URL, $url); 
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
      curl_setopt($ch, CURLOPT_PROXYPORT, 3128); 
      curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
      $response = curl_exec($ch); 
      curl_close($ch); 
      $response_a = json_decode($response, true); 
      if (isset($response_a['rows'][0]['elements'][0]['distance']['value'])) { 
       $m = $response_a['rows'][0]['elements'][0]['distance']['value']; 
      }else{ 
       $m = 0; 
      } 

      $staticDistanceModel->insertStatic($origins, $destination, $m); 
     } 
    } 

: 私はCURLとGoogleに電話をかける機能を作成しました私のコントローラ私はforEach()のように:

foreach ($array as $object) { 
    $calculator = $this->calculateDistance($object->origins, $object->destination); 
} 

しかし、 se google limitリクエスト、そしておそらく5500レコードの時間が長いので、配列をチャンクすることができます。

ご希望の方はこちら

関連する問題