2016-03-30 13 views
1

Ich habe eine MySQL-Tabelle in folgendem Format mit rund 500 Zeilenphp langsame Reaktionszeit mit Google Maps API

ID¦name¦stuff¦location 

Mein PHP-Skript erhält einen Benutzer Lage, wählt alle Zeilen aus der Datenbank und dann bekommt die Entfernung von jedem Zeilen Standort zum Benutzer Standort mit der Google Maps API und legt alles in einem JSON-Array

Das Problem ist sogar die Verarbeitung von 500 Zeilen dauert 300 Sekunden im Durchschnitt, ich wollte es auf etwa 3- 4 Sekunden irgendwie, es scheint die Google Maps API zu sein, die das gesamte Skript bottlenecking.

Was ich frage ist, ob es eine bessere Möglichkeit gibt, mit der ganzen Sache umzugehen, damit ich das Skript in weniger als 10 Sekunden verarbeiten kann.

die PHP-Skript -

<?php 
//used for benchmarking 
$time_start = microtime(true); 
require_once 'db.php'; 

//get the users location 
$location = $_GET['location']; 

       //check the users location is valid 
      if (checkLocation($location) == "found") { 

        echo "null"; 

      } else { 
       //select all of the rows 
       $SQLSelect = $odb -> query("SELECT * FROM `something`"); 
        $array = array(); 
        $count = 0; 
        while ($show = $SQLSelect -> fetch(PDO::FETCH_ASSOC)) { 
         $distance = getDistance($location, $show['location']); 
          $distance = $distance * 0.000621371192; 

             //narrow down the distance 
             if ($distance < 100) { 

$array[$count] = array(); 
$array[$count]['name'] = $show['locationName']; 
$array[$count]['spec'] = $show['spec']; 
$array[$count]['distance'] = round($distance); 
             $count = $count + 1; 
             } 
        } 
        //sort the array based on distance 
usort($array,function($a,$b) {return strnatcasecmp($a['distance'],$b['distance']);}); 
        echo json_encode($array); 
      } 


       function getDistance($start, $end) { 
        $from = $start; 
        $to = $end; 
        $from = urlencode($from); 
        $to = urlencode($to); 

        $data = file_get_contents("http://maps.googleapis.com/maps/api/distancematrix/json?origins=$from&destinations=$to&language=en-EN&sensor=false"); 

        $data = json_decode($data); 
        $time = 0; 
        $distance = 0; 
        foreach($data->rows[0]->elements as $road) { 
        $time += $road->duration->value; 
        $distance += $road->distance->value; 
        } 

        return $distance; 
        } 



        function checkLocation($start) { 
        $from = $start; 
        $to = 'location1'; 
        $from = urlencode($from); 
        $to = urlencode($to); 

        $data = file_get_contents("http://maps.googleapis.com/maps/api/distancematrix/json?origins=$from&destinations=$to&language=en-EN&sensor=false"); 
        if (strpos($data, '"status" : "NOT_FOUND"') !== false) { 
        return "found"; 
         } else { 
          return "null"; 
         } 
       } 

        echo '</br>Total execution time in seconds: ' . (microtime(true) - $time_start);   
?> 
+0

werden Sie nie schaffen, 500 Abfragen an die Google Maps API in 10s ~ Sie könnten besser mit PHP die Entfernungen basierend auf einem Port der Havershine (?) Formel – RamRaider

+0

Ich versuchte mit etwas ähnliches, aber es gefunden um ganz ungenau zu sein –

Antwort

0

Ihre einzige Option der Dinge zu beschleunigen ist mit all den Google Maps-API-Anforderungen zu beseitigen. Ich würde Ihre Skript- und Datenbanktabelle ändern, um Breiten- und Längengradpunkte für den Standort des Benutzers und Elemente in Ihrer Datenbank zu verwenden.

Es ist möglich, den Abstand (als Luftlinie) zwischen zwei lat und lng Punkten mit MySQL zu berechnen, wie hier zu sehen: Find distance between two points using latitude and longitude in mysql

Wenn Sie diese Methode wechseln würden Sie definitiv in der Lage sein, das Skript zu erhalten, Lauf in < 4 Sekunden.

+0

Wie im Kommentar erwähnt, habe ich versucht, mit dieser Methode, aber weil ich auch lange Strecken berechnen muss, kann es bis zu einem Grad von fast 80 Meilen ungenau sein, wenn Sie eine 200 Meile Reise berechnen –

+0

Wenn Sie Ungenauigkeiten finden Toll, dann musst du die Mathematik falsch gemacht haben. Denken Sie auch daran, dass die Methode, die ich erwähnte, die Entfernung in einer geraden Linie berechnet, während Google Maps die Fahrstrecke entlang einer Straße angibt. –

+0

Vielen Dank, es gelang, Länge/Breite zu verwenden, um eine bestimmte Entfernung zu berechnen und dann die zusätzliche "Kilometerleistung" zu berechnen, indem ungefähr 1/5 der Reise hinzugefügt wurde :) –