2016-09-13 2 views
1

Я пытаюсь ускорить работу своего сайта, обрабатывая запросы cURL. Я запускаю около 3 запросов, два идут на один и тот же сервер. Вот мой код:Processing Несколько запросов cURL в PHP быстрее

$profile = curl_init(); 
curl_setopt($profile, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($profile, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($profile, CURLOPT_FAILONERROR, true); 
curl_setopt($profile, CURLOPT_URL,"https://owapi.net/api/v2/u/".$battletag."/stats/".$mode."?platform=".$platform); 
$result = curl_exec($profile); //grab API data 
curl_close($profile); 
$stats = json_decode($result, true); //decode JSON data 


$profile1 = curl_init(); 
curl_setopt($profile1, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($profile1, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($profile1, CURLOPT_FAILONERROR, true); 
curl_setopt($profile1, CURLOPT_URL,"https://api.lootbox.eu/".$platform."/us/".$battletag."/profile"); 
$result1 = curl_exec($profile1); //grab API data 
curl_close($profile1); 
$stats1 = json_decode($result1, true); 

$hero_stats = curl_init(); 
curl_setopt($hero_stats, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($hero_stats, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($hero_stats, CURLOPT_FAILONERROR, true); 
curl_setopt($hero_stats, CURLOPT_URL,"https://api.lootbox.eu/".$platform."/us/".$battletag."/competitive-play/heroes"); 
$hero_play_time = curl_exec($hero_stats); //grab API data 
curl_close($hero_stats); 
$heroes_info = json_decode($hero_play_time, true); 

Как я могу обработать эти запросы в то же время без перезагрузки соединения? Я хочу ускорить загрузку моего сайта, потому что сейчас это занимает много времени. Любая помощь будет оценена по достоинству. Я слышал о методе curl_multi_init(), но я не уверен, как правильно его использовать. Любая помощь будет приветствоваться.

Спасибо.

+0

Возможно, нет способа сделать соединение более быстрым, но вы считали кэширование? (Учитывая, что это жизнеспособная возможность c). С учетом сказанного, вы не можете много сделать с этим, это в основном зависит от того, сколько данных вы получаете (как в буквальном количестве, тем меньше, тем лучше) и о том, насколько быстро подходят API-интерфейсы. – Andrew

+0

@ У меня нет, и на самом деле это отличная идея. Это возможность, мне просто нужно добавить какое-то обновление кеша, чтобы пользователь мог обновить свои результаты. – Redbit

+0

Ну, вот и вы. Я предлагаю [PHP Redis] (https://github.com/phpredis/phpredis) (который на самом деле написан на C, поскольку это имя НЕ означает, и является тупо быстрым, если вы не работаете на нескольких серверах, то это плохая идея). Если вы работаете на нескольких серверах и вам нужно синхронизировать, я думаю, что Memcache - хороший выбор, как любой. – Andrew

ответ

0

Хорошо спасибо за помощь всем. Особенно @ Andrew.

Я нашел решение, которое закончило работу. Отправьте его здесь для других людей с аналогичной проблемой.

function multiRequest($data, $options = array()) { 

    // array of curl handles 
    $curly = array(); 
    // data to be returned 
    $result = array(); 

    // multi handle 
    $mh = curl_multi_init(); 

    // loop through $data and create curl handles 
    // then add them to the multi-handle 
    foreach ($data as $id => $d) { 

    $curly[$id] = curl_init(); 

    $url = (is_array($d) && !empty($d['url'])) ? $d['url'] : $d; 
    curl_setopt($curly[$id], CURLOPT_URL,   $url); 
    curl_setopt($curly[$id], CURLOPT_HEADER,   0); 
    curl_setopt($curly[$id], CURLOPT_RETURNTRANSFER, 1); 

    // post? 
    if (is_array($d)) { 
     if (!empty($d['post'])) { 
     curl_setopt($curly[$id], CURLOPT_POST,  1); 
     curl_setopt($curly[$id], CURLOPT_POSTFIELDS, $d['post']); 
     } 
    } 

    // extra options? 
    if (!empty($options)) { 
     curl_setopt_array($curly[$id], $options); 
    } 

    curl_multi_add_handle($mh, $curly[$id]); 
    } 

    // execute the handles 
    $running = null; 
    do { 
    curl_multi_exec($mh, $running); 
    } while($running > 0); 


    // get content and remove handles 
    foreach($curly as $id => $c) { 
    $result[$id] = json_decode(curl_multi_getcontent($c), true); 
    curl_multi_remove_handle($mh, $c); 
    } 

    // all done 
    curl_multi_close($mh); 

    return $result; 
} 

$data = array(
    'https://owapi.net/api/v2/u/'.$battletag.'/stats/'.$mode.'?platform='.$platform, 
    'https://api.lootbox.eu/'.$platform.'/us/'.$battletag.'/profile', 
    'https://api.lootbox.eu/'.$platform.'/us/'.$battletag.'/competitive-play/heroes' 
); 
$r = multiRequest($data); 

Это сработало, мне просто пришлось добавить метод json_decode по методу get_contents.

Еще раз спасибо. Очень ценю помощь.

Смежные вопросы