Advertisement
vanchelo

Untitled

Mar 26th, 2013
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 3.11 KB | None | 0 0
  1. <?php
  2.  
  3. // страницы, содержимое которых надо получить
  4. $urls = array('ya.ru/keks.html','ya.ru');
  5.  
  6. // инициализируем "контейнер" для отдельных соединений (мультикурл)
  7. $cmh = curl_multi_init();
  8.  
  9. // массив заданий для мультикурла
  10. $tasks = array();
  11. // перебираем наши урлы
  12. foreach ($urls as $url) {
  13.     // инициализируем отдельное соединение (поток)
  14.     $ch = curl_init('http://'.$url);
  15.     // если будет редирект - перейти по нему
  16.     curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  17.     // возвращать результат
  18.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  19.     // не возвращать http-заголовок
  20.     curl_setopt($ch, CURLOPT_HEADER, 0);
  21.     // таймаут соединения
  22.     curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
  23.     // таймаут ожидания
  24.     curl_setopt($ch, CURLOPT_TIMEOUT, 10);
  25.     // добавляем дескриптор потока в массив заданий
  26.     $tasks[$url] = $ch;
  27.     // добавляем дескриптор потока в мультикурл
  28.     curl_multi_add_handle($cmh, $ch);
  29. }
  30.  
  31. // количество активных потоков
  32. $active = null;
  33. // запускаем выполнение потоков
  34. do {
  35.     $mrc = curl_multi_exec($cmh, $active);
  36. }
  37. while ($mrc == CURLM_CALL_MULTI_PERFORM);
  38. $result = array();
  39. // выполняем, пока есть активные потоки
  40. while ($active && ($mrc == CURLM_OK)) {
  41.     // если какой-либо поток готов к действиям
  42.     if (curl_multi_select($cmh) != -1) {
  43.         // ждем, пока что-нибудь изменится
  44.         do {
  45.             $mrc = curl_multi_exec($cmh, $active);
  46.             // получаем информацию о потоке
  47.             $info = curl_multi_info_read($cmh);
  48.             // если поток завершился
  49.             if ($info['msg'] == CURLMSG_DONE) {
  50.                 $ch = $info['handle'];
  51.                 // ищем урл страницы по дескриптору потока в массиве заданий
  52.                 $url = array_search($ch, $tasks);
  53.                 // забираем содержимое
  54.                 $result[$url]['answer'] = curl_multi_getcontent($ch);
  55.                 $result[$url]['status'] = curl_getinfo($ch, CURLINFO_HTTP_CODE);
  56.                 $result[$url]['content-type'] = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
  57.                 $result[$url]['error'] = curl_errno($ch);
  58.                 // удаляем поток из мультикурла
  59.                 curl_multi_remove_handle($cmh, $ch);
  60.                 // закрываем отдельное соединение (поток)
  61.                 curl_close($ch);
  62.             }
  63.         }
  64.         while ($mrc == CURLM_CALL_MULTI_PERFORM);
  65.     }
  66. }
  67.  
  68. // закрываем мультикурл
  69. curl_multi_close($cmh);
  70. echo '<pre>';
  71. print_r($result);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement