PHP: Настоящая многопоточность в CURL


Для одного проекта понадобилось автоматически скачивать несколько сотен небольших файлов при сохранении. Конечно же сразу применили чудо-библиотека Curl. Все бы ничего – но время ожидания заставило задуматься над решением запуска многопоточного исполнения кода. Недолгий поиск решения привел на хороший пример, который мы и использовали.

Таким способом мы создаем массив и потом ПО ОЧЕРЕДИ обходим каждую ссылку. Если ссылок 2-3 – это не проблема, а если их 300? Это заставляет нас ждать… долго ждать…

<?php
$urls = array(
    'http://graph.facebook.com/http://tech.vg.no',
    'http://graph.facebook.com/http://www.vg.no',
);

foreach ($urls as $url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    echo curl_exec($ch);
    curl_close($ch);
}
?>

А вот пример многопоточного исполнения:

<?php
$urls = array(
    'http://graph.facebook.com/http://tech.vg.no',
    'http://graph.facebook.com/http://www.vg.no',
);

$multi = curl_multi_init();
$channels = array();

foreach ($urls as $url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    curl_multi_add_handle($multi, $ch);

    $channels[$url] = $ch;
}

$active = null;
do {
    $mrc = curl_multi_exec($multi, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active && $mrc == CURLM_OK) {
    if (curl_multi_select($multi) == -1) {
        continue;
    }

    do {
        $mrc = curl_multi_exec($multi, $active);
    } while ($mrc == CURLM_CALL_MULTI_PERFORM);
}

foreach ($channels as $channel) {
    echo curl_multi_getcontent($channel);
    curl_multi_remove_handle($multi, $channel);
}

curl_multi_close($multi);
?>

Скорость выполнения… ну тут и сравнивать не нужно :)


Другие публикации:



Написать комментарий через:

 
               
  • Локальный блог
  •  
 

Ваш отзыв

Имя *

Почта (скрыта) *

Сайт

Напишите цифрами двa вoceмь двa *

Сообщение

Отзывов (3) на «PHP: Настоящая многопоточность в CURL»

  1. Павел пишет:

    Пример не работает. Просто зависает страница. Вы хоть сами тестируете?

  2. Роман пишет:

    Код работает. Но при выполнении curl_multi_getcontent вместо отправки post запроса и получения соответствующего ответа просто загружается страница по указанному адресу. что надо изменить для работы мультикурла чтобы получать ответы на post запросы? тот же код но без использования мультикурла работает как надо.

 
Возврат % от покупок
Статусы для соц.сетей на ArtKiev Design Studio