Модераторы: Aliance, skyboy, MoLeX, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> и снова curl_multi... кто использовал, помогите разобраться 
:(
    Опции темы
cia
Дата 20.4.2008, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 15.1.2007

Репутация: нет
Всего: 4



Собственно, кто использовал это недокументированное чудо, помогите...

Вот кусок кода из примера на php.net:
Код

do {
  $res=curl_multi_exec($mh,$flows);
} while($flows>0);


Как я понял в $flows помещается количество активных потоков и цикл продолжается пока не отработают все.
И вот несколько вопросов:
1. Что возвращает curl_multi_exec в $res?
2. Есть ли возможность установить функцию-обработчик, чтобы отловить момент окончания работы одного из потоков.
3. Как в приведенном выше цикле определить какой именно поток закончил работу в то время, когда другие еще не закончили?
PM WWW ICQ   Вверх
cia
Дата 23.4.2008, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 15.1.2007

Репутация: нет
Всего: 4



Таки никто не в курсе? А все-таки очень хотелось бы знать...
Тогда буду писать сокетами
PM WWW ICQ   Вверх
Fortop
Дата 23.4.2008, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 1
Всего: 42



1,2,3. http://ua.php.net/manual/en/function.curl-multi-exec.php
Тут есть почти все что ты спросил.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
cia
Дата 25.4.2008, 17:24 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 15.1.2007

Репутация: нет
Всего: 4



Fortop, Да не очень там все хорошо описано, да плюс еще в английском я весьма плохо шарю.

Ну, короче, просидел весь день, но разобрался.
Вот как работает у меня, может кому понадобится...

Код

//Инициализируем обычные курлы и прописываем их в мультикурл.
//Количество потоков в $flowcount. Для каждого потока берется урл из массива $urls.
$ch=array();
$mh=curl_multi_init();
for($flow=0;$flow<$flowcount;$flow++) {
  $url=array_pop($urls);
  ch[]=curl_init($url);  
  curl_setopt($ch[$flow],CURLOPT_RETURNTRANSFER,1);
  curl_multi_add_handle($mh,$ch[$flow]);
}
$flows=null;
do {
  do curl_multi_exec($mh,$flows); while($flows==$flowcount); //Ждать пока не отработает хотя бы один поток
  $info=curl_multi_info_read($mh); //Получение информации об отработавшем потоке
  if(!count($urls)) { //Больше ничего грузить не надо
    curl_multi_remove_handle($mh,$info['handle']);
    curl_close($info['handle']);
    $flowcount--;
  } else {
    //Прописать в отработавший поток новый урл
    curl_setopt($info['handle'],CURLOPT_URL,array_pop($urls));
    $res=curl_multi_getcontent($info['handle']);
    curl_multi_remove_handle($mh,$info['handle']);
    curl_multi_add_handle($mh,$info['handle']);
    curl_multi_exec($mh,$flows);
    //Загруженная страница в $res! Делаем с ней что нам надо
    // . . .
  }
} while($flows>0);
curl_multi_close($mh);


Писал в блокноте, может где и ошибся.
1) curl_multi_exec при каждом вызове помещает в $flows количество активных потоков, поэтому ждем когда $flows будет меньше $flowcount
2) curl_multi_info_read возвращает информацио об очередном отработавшем потоке или false, если с момента последнего вызова этой функции ни каких новых событий нет
3) информация в $info обновляется только при вызове curl_multi_exec, поэтому ожидать окончания работы потока при помощи этой функции не получится
4) новый урл можно запустить только через последовательный вызов трех функций: curl_multi_remove_handle, curl_multi_add_handle и curl_multi_exec

PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Сеть | Следующая тема »


 




[ Время генерации скрипта: 0.0445 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.