2014-01-06 3 views
2

У меня есть веб-портал, которому необходимо загрузить много отдельных json-файлов и отобразить их содержимое в виде вида формы. По лотам я имею в виду 32 отдельных файла.Самый быстрый способ загрузки нескольких URL-адресов

Я пробовал cUrl с итерацией грубой силы и ее принятием ~ 12,5 секунд.

Я пробовал curl_multi_exec, как показано здесь http://www.php.net/manual/en/function.curl-multi-init.php с функцией ниже и ее выбором ~ 9 секунд. Немного лучше, но все еще ужасно медленно.

function multiple_threads_request($nodes){ 
    $mh = curl_multi_init(); 
    $curl_array = array(); 
    foreach($nodes as $i => $url) 
    { 
     $curl_array[$i] = curl_init($url); 
     curl_setopt($curl_array[$i], CURLOPT_RETURNTRANSFER, true); 
     curl_multi_add_handle($mh, $curl_array[$i]); 
    } 
    $running = NULL; 
    do { 
     curl_multi_exec($mh,$running); 
    } while($running > 0); 

    $res = array(); 
    foreach($nodes as $i => $url) 
    { 
     $res[$url] = curl_multi_getcontent($curl_array[$i]); 
    } 

    foreach($nodes as $i => $url){ 
     curl_multi_remove_handle($mh, $curl_array[$i]); 
    } 
    curl_multi_close($mh); 
    return $res; 
} 

Я понимаю, что это дорогостоящая операция, но кто-нибудь знает какие-либо другие альтернативы, которые могут быть быстрее?

EDIT: В конце концов, моя система ограничивали curl_multi_exec и перемещение кода на производственную машину увидели значительные улучшения

+2

Должно ли это быть в бэкэнде? Почему бы вам не переместить выборку клиенту? Некоторые магические заклинания AJAX, ходовые представления и ваш основной результат. В waaaay менее 9 секунд. ;-) – nietonfir

+0

да ... я подумал об этом, но мне пришлось бы легко реорганизовать ~ 75% моей работы, которую я не могу сделать в краткосрочной перспективе. В долгосрочной перспективе это определенно то, что я должен делать. – Brad

+3

Кэширует вариант? Либо явно, либо неявно. (Он в значительной степени ортогонален перемещению выборки на стороне клиента.) – user2864740

ответ

2

Вы определенно должны смотреть в бенчмаркинг кудрей, чтобы увидеть, какой из них имеет спад, но это было слишком длительным для комментариев, так что дайте мне знать, если это поможет или нет:

// revert to "cURLing with brute force iteration" as you described it :) 

$curl_timer = array(); 

foreach($curlsite as $row) 
{ 
    $start = microtime(true); 

    /** 
    * curl code 
    */ 

    $curl_timer[] = (microtime(true)-$start); 
} 

echo '<pre>'.print_r($curl_timer, true).'</pre>'; 
+0

Я дам этот снимок – Brad

+0

Самый медленный один ~ 600 мс. Самый быстрый был 200. Среднее было apx 250ms – Brad

+0

Итак ~ 8 секунд для 32 итераций, когда делалось по одному за раз? – MonkeyZeus

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