Портфоліо
Розробляємо інтернет-магазини, CRM системи, SaaS, APP платформи — впроваджуємо AI у процеси та рішення.
Client Logo
Icon 5.0
+150 клієнтів
Новий проєкт
Project Image
Технології
Розробляємо інтернет-магазини, CRM системи, SaaS, APP платформи — впроваджуємо AI у процеси та рішення.
Client Logo
Icon 5.0
+150 клієнтів
Новий проєкт
Project Image
15.10.2025

PHP: Справжня багатопоточність в CURL

Blog Image

Якщо Вам знадобилося автоматично завантажувати декілька сотень невеликих файлів при збереженні.

Звичайно ж відразу застосовуйте чудо-бібліотека 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);
?>
Давайте
рухати
світ
разом
стати клієнтом
Redstone Icon
Зателефонувати
Менеджер REDSTONE
Play Muted Unmuted Link Drag