Почему curl_multi_exec занимает намного больше времени, чем самый медленный URL-адрес?

Я пытаюсь какой-то многозадачности с помощью curl. Задача, которую выполняют кудри, — искать строку в нескольких 4-мегабайтных файлах. Когда я делегировал один вызов curl для каждого файла, это было уже некоторым преимуществом по сравнению с одним PHP, сканирующим их все. Для сканирования всех файлов потребовалось от 3 до 4 секунд. Затем я решил создать ДВА кудря для каждого сканирования файла, каждый вызов скручивания сканирует половину файла. Я чувствовал, что не получил ожидаемого увеличения скорости, поэтому я попробовал 4 скручивания для каждого файла, потому что я хотел проверить соотношение накладных расходов и эффективности. Некоторое профилирование показало мне, что:

$running = null;
do {
curl_multi_exec($mh, $running);
} while($running > 0);

Требуется около 4 секунд, чтобы завершить 28 кудрей. Теперь самое длинное время завитка было 0,4. Почему была разница? Я думал, что каким-то образом блокировал его, но добавленные значения 28 выполнений (измеренных независимо внутри вызываемых PHP) легко подскочили бы на 10 с, поэтому «многозадачность» была там.

Чтобы прояснить ситуацию, вот что я использую:

function multiRequest($data, $options = array(),$color) {

// array of curl handles
$curly = array();
// data to be returned
$result = array();

// multi handle
$mh = curl_multi_init();

// loop through $data and create curl handles
// then add them to the multi-handle
foreach ($data as $id => $d) {

$curly[$id] = curl_init();

$url = (is_array($d) && !empty($d['url'])) ? $d['url'] : $d;
curl_setopt($curly[$id], CURLOPT_URL,            $url);
//curl_setopt($curly[$id], CURLOPT_TIMEOUT,1); <-- this would make my     computer a zombie, seemingly worrying about NOTHING but the curls
curl_setopt($curly[$id], CURLOPT_FRESH_CONNECT, true); //<-- I added     this line cuz I heard its good
curl_setopt($curly[$id], CURLOPT_HEADER,         0);
curl_setopt($curly[$id], CURLOPT_RETURNTRANSFER, 1);

// post?
if (is_array($d)) {
if (!empty($d['post'])) {
curl_setopt($curly[$id], CURLOPT_POST,       1);
curl_setopt($curly[$id], CURLOPT_POSTFIELDS, $d['post']);
}
}

// extra options?
if (!empty($options)) {
curl_setopt_array($curly[$id], $options);
}
curl_multi_add_handle($mh, $curly[$id]);
}

// execute the handles
$running = null;
do {
curl_multi_exec($mh, $running); //<--- grrrr
} while($running > 0);

// get content and remove handles
foreach($curly as $id => $c) {
$result[$id] = curl_multi_getcontent($c);

curl_multi_remove_handle($mh, $c);
}
// all done
curl_multi_close($mh);
}

(Я читал, что есть метод, который я могу добавить функцию обратного вызова, которая запускается, по-видимому, по ходу процесса, и это позволило бы мне некоторые манипуляции с частью «получить содержимое и удалить дескрипторы», но возможно ли обойти ожидание в цикл curl_multi_exec, пока выполняются файлы curl? Или мы должны продолжать вызывать curl_multi_exec для продолжения выполнения? Я думаю: 1 имеет вызов curl для PHPs / 2 curl не ждет и не возвращает, а для нас он мертв, но он запускает нужные PHP / 3 PHP записывают данные в файлы в своем собственном темпе, в то время как основная программа сканирует эти файлы, теоретически завивая все еще имея дело с накладными расходами, пока мы уже вернулись к клиенту …)
Заранее спасибо.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]