Как ограничить количество потоков curl-multi?

Рейтинг: 0Ответов: 1Опубликовано: 03.08.2023

Всем привет! Делаю парсер интернет-магазина, в котором при задании ссылок на списки товаров выдаются параметры из карточки товара. Одним словом, парсер на входе должен получать ссылку на список товаров (напр., https://klery.ru/zhenskaya-odezhda/ ) и далее переходить по каждому товару и вытягивать оттуда инфу. За основу взято curl-multi. Чтобы товары на выходе следовали в том же порядке, что и в магазине, необходимо ограничить количество потоков curl-multi до 1. У меня есть следующий код:

$urls = array( "https://klery.ru/zhenskaya-odezhda/", "https://klery.ru/muzhskaya-odezhda/" );
$mh = curl_multi_init();
$chs = array();
foreach ($urls as $url) {
    $chs[] = ($ch = curl_init());
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
    curl_multi_add_handle($mh, $ch);
}
$prev_running = $running = null;
do {
    curl_multi_exec($mh, $running);
    if ($running != $prev_running) {
        $info = curl_multi_info_read($mh);
        if (is_array($info) && ($ch = $info['handle'])) {
            $content = curl_multi_getcontent($ch);
            $htmlArr[] = $content;
        }
        $prev_running = $running;
    }
} while ($running > 0);
foreach ($chs as $ch) {
    curl_multi_remove_handle($mh, $ch);
    curl_close($ch);
}
curl_multi_close($mh);    

// тут какая-то обработка текста страницы
$dom = new DOMDocument();
foreach ($htmlArr as $html) {
    @$dom->loadHTML($html);
    $xpath = new DOMXPath($dom);

    //XPath ссылки на товар
    $XPathHref = "//div[@class='product-thumb']//div[@class='caption2']/a/@href";
    $href = $xpath->query($XPathHref);

}

Никак не могу понять, как правильно сделать ограничение потоков до 1. Т.е. нужно делать по одному запросу и запускать в цикле i раз, где i - количество полученных ссылок на карточки товаров. Не подскажете правильный код?

Ответы

▲ 0

Вопрос решен применением обычных curl запросов вместо curl-multi по советам пользователя u_mulder. Всем спасибо!