2012-08-12 6 views
3

Je suis en train de développer une API RESTful basée sur le Web pour un client. Tout fonctionne très bien en dehors d'une requête, dans laquelle je dois demander l'API Foursquare pour chaque ligne.Optimisation des performances: nombreuses requêtes CURL

L'URL de cette demande est: http://api.example.com/v1/users/times.

Actuellement, la réponse d'une demande à cette URL est:

{ 
"response": { 
    "user": { 
     ... some user info ... 
     "times": [ 
      { 
       "id": "8", 
       "venue_fq_id": "4b81eb25f964a52000c430e3", 
       "user_id": "1", 
       "wait_length": "4468", 
       "created_at": "2012-06-09 21:45:43" 
      }, 
      { 
       "id": "9", 
       "venue_fq_id": "4aad285af964a520c05e20e3", 
       "user_id": "1", 
       "wait_length": "8512", 
       "created_at": "2012-06-09 21:45:43" 
      }, 
      { 
       "id": "10", 
       "venue_fq_id": "42377700f964a52024201fe3", 
       "user_id": "1", 
       "wait_length": "29155", 
       "created_at": "2012-06-09 21:45:44" 
      }, 
      { 
       "id": "11", 
       "venue_fq_id": "45c88764f964a5206e421fe3", 
       "user_id": "1", 
       "wait_length": "33841", 
       "created_at": "2012-06-09 21:45:44" 
      }, 
      { 
       "id": "12", 
       "venue_fq_id": "430d0a00f964a5203e271fe3", 
       "user_id": "1", 
       "wait_length": "81739", 
       "created_at": "2012-06-09 21:45:44" 
      } 
     ] 
    } 
}, 
"stat": "ok" 
} 

Cependant, le venue_fq_id étant retourné dans le tableau response.user.times est par rapport à un lieu sur l'API Foursquare. J'ai essayé d'exécuter une requête curl à l'API Foursquare pour chaque ligne, mais la performance est incroyablement lente. S'il vous plaît pouvez-vous donner quelques exemples de façons dont je pourrais accélérer la performance tout en récupérant la même information que j'aurais eu accès à l'API F/Q à chaque fois?

Voici mon code:

$query = $this->db->query("SELECT * FROM `wait_times` WHERE `user_id` = ?", array($email_address)); 

$wait_times = $query->result(); 

foreach ($wait_times as $wait_time) { 

    $wait_time->venue = $this->venue_info($wait_time->venue_fq_id); 

} 

function venue_info($fq_id) { 

    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, "https://api.foursquare.com/v2/venues/4b522afaf964a5200b6d27e3"); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

    $response = json_decode(curl_exec($ch)); 
    curl_close($ch); 

    return $response['response']['venue']; 

} 

Répondre

8

Vous perdez une quantité horrible de temps instanciation/démolissant objets CURL. Cela vous empêche de profiter des keep-alives HTTP, forçant curl à démarrer une nouvelle connexion tcp pour chaque requête que vous faites.

Les poignées de courbe CAN peuvent être réutilisées. par exemple.

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 


function venue_info($fq_id) { 
    global $ch; 
    curl_setopt($ch, CURLOPT_URL, "https://api.foursquare.com/v2/venues/4b522afaf964a5200b6d27e3"); 
    $resp = curl_exec($ch) or die(curl_error($ch)); 
    $json = json_decode($resp); 
    return($json); 
} 
0

L'API Foursquare fournit le point final multi pour vous permettre de combiner jusqu'à cinq requêtes en une seule requête.

+0

Ceci doit être fait sans avoir à se connecter. –