max*_*ax_ 3 php optimization curl caching
我正在为客户开发基于Web的RESTful api.除了一个请求之外,一切都很好,我需要为每行请求Foursquare API.
此请求的网址为:http://api.example.com/v1/users/times.
目前,对该URL的请求的响应是:
{
"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"
}
Run Code Online (Sandbox Code Playgroud)
但是,venue_fq_id
在response.user.times
数组中返回的是相对于Foursquare API上的场地.我尝试为每一行运行Foursquare API的curl请求,但性能非常慢.请问您能否提供一些示例,说明我可以在检索相同信息的同时加快性能,我每次都要访问F/Q API?
这是我的代码:
$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'];
}
Run Code Online (Sandbox Code Playgroud)
你浪费了大量的时间来实例化/拆除CURL对象.这会阻止您利用HTTP keep-alives,强制curl为您发出的每个请求启动新的tcp连接.
卷曲把手CAN被重用.例如
$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);
}
Run Code Online (Sandbox Code Playgroud)