Работа с мультикурл
// инициализируем "контейнер" для отдельных соединений (мультикурл)
$cmh = curl_multi_init();
// массив заданий для мультикурла
$tasks = array();
// перебираем наши урлы
foreach ($urls as $id) {
// инициализируем отдельное соединение (поток)
$ch = curl_init('http://site.ru/'.$id);
// если будет редирект - перейти по нему
//curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
// возвращать результат
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// не возвращать http-заголовок
curl_setopt($ch, CURLOPT_HEADER, 0);
// таймаут соединения
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);
// таймаут ожидания
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
// добавляем дескриптор потока в массив заданий
$tasks[$id] = $ch;
// добавляем дескриптор потока в мультикурл
curl_multi_add_handle($cmh, $ch);
}
// количество активных потоков
$active = null;
// запускаем выполнение потоков
do {
$mrc = curl_multi_exec($cmh, $active);
}
while ($mrc == CURLM_CALL_MULTI_PERFORM);
// выполняем, пока есть активные потоки
while ($active && ($mrc == CURLM_OK)) {
// если какой-либо поток готов к действиям
if (curl_multi_select($cmh) != -1) {
// ждем, пока что-нибудь изменится
do {
$mrc = curl_multi_exec($cmh, $active);
// получаем информацию о потоке
$info = curl_multi_info_read($cmh);
// если поток завершился
if ($info['msg'] == CURLMSG_DONE) {
$ch = $info['handle'];
// ищем урл страницы по дескриптору потока в массиве заданий
$url = array_search($ch, $tasks);
// забираем содержимое
$tasks[$url] = curl_multi_getcontent($ch);
print_r($tasks[$url]);
// удаляем поток из мультикурла
curl_multi_remove_handle($cmh, $ch);
// закрываем отдельное соединение (поток)
curl_close($ch);
}
}
while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
// закрываем мультикурл
curl_multi_close($cmh);