Я пытаюсь какой-то многозадачности с помощью 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 записывают данные в файлы в своем собственном темпе, в то время как основная программа сканирует эти файлы, теоретически завивая все еще имея дело с накладными расходами, пока мы уже вернулись к клиенту …)
Заранее спасибо.
Задача ещё не решена.
Других решений пока нет …