sasha_ua
Постоялец
- Регистрация
- 22 Июн 2010
- Сообщения
- 66
- Реакции
- 0
- Автор темы
- #1
PHP:
<?php
// страницы, содержимое которых надо получить
$urls = array("link1", "link2", "link3", "link4");
// инициализируем "контейнер" для отдельных соединений (мультикурл)
$cmh = curl_multi_init();
// массив заданий для мультикурла
$tasks = array();
// перебираем наши урлы
foreach ($urls as $url) {
$proxy = get_rand_proxy(); // Запрос произвольного прокси
$uagent = get_rand_uagent(); // Запрос произвольного юзнр-агента
// инициализируем отдельное соединение (поток)
$ch = curl_init($url);
// задаем прокси-сервер
curl_setopt($ch, CURLOPT_PROXY, $proxy);
// задаем юзер-агент
curl_setopt($ch, CURLOPT_USERAGENT, $uagent);
// если будет редирект - перейти по нему
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
// возвращать результат
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// не возвращать http-заголовок
curl_setopt($ch, CURLOPT_HEADER, 0);
// таймаут соединения
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
// таймаут ожидания
curl_setopt($ch, CURLOPT_TIMEOUT, 20);
// добавляем дескриптор потока в массив заданий
$tasks[$url] = $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);
// удаляем поток из мультикурла
curl_multi_remove_handle($cmh, $ch);
// закрываем отдельное соединение (поток)
curl_close($ch);
}
}
while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
print_r($tasks);
// закрываем мультикурл
curl_multi_close($cmh);
?>
Проблема:
1. Если закомментировать:
Страницы скачиваются, но не всегда до конца, возможно таймаут низкий.curl_setopt($ch, CURLOPT_USERAGENT, $uagent);
2. Если закомментировать:
Вудет выдавать Bad Request$proxy = get_rand_proxy();
Вопросы:
1. Что неправильно в коде?
2. Как добавить подстановку другого прокси, если предыдущий оказался нерабочий, или страница загружена не полностью?