curl_multi_info_read - Форум успешных вебмастеров - GoFuckBiz.com
 
 
Форум успешных вебмастеров - GoFuckBiz.com

  Форум успешных вебмастеров - GoFuckBiz.com > Бизнес-решения > Скрипты, программы и технические решения
Дата
USD/RUB93.4409
BTC/USD64727.8860
Скрипты, программы и технические решения Обсуждаем скрипты, программы и новые технологии.

Закрытая тема
Опции темы Опции просмотра
Старый 07.09.2009, 23:47   #1
digg
$400
 
Аватар для digg
 
Регистрация: 17.05.2009
Сообщений: 13,949
Бабло: $1895460
Отправить сообщение для digg с помощью ICQ
По умолчанию curl_multi_info_read

curl_multi_info_read

подскажите пожалуйста, кто имеет опыт работы с мультикурлом
пытаюсь создать многопоточный процесс, чтоб при каждом заверщении одного из задания запускалось следующее
вот по этому примеру делаю http://seoutils.net/archives/187 , но отличие в том, что у меня нет массива урлов, курлом запскается один и тот же файл
вот фрагмент моего кода:
PHP код:
set_time_limit(0);

$treads 10;


  
$ch=array();
  for(
$flow=0;$flow<$treads;$flow++) $ch[]=curl_init('my.php'); //создание массива cURL
  
$mh=curl_multi_init(); //создание cURL_multi
  
for($flow=0;$flow<$treads;$flow++) { //В этом цикле инициализируются cURL
    
curl_setopt($ch[$flow],CURLOPT_REFERER,'TESTREFERER');
    
curl_setopt($ch[$flow],CURLOPT_RETURNTRANSFER,1);
    
curl_setopt($ch[$flow],CURLOPT_POST,1);
    
curl_setopt($ch[$flow],CURLOPT_POSTFIELDS,'TEST=TESTVAR');
    
curl_setopt($ch[$flow],CURLOPT_COOKIE,'TEST=TESTCOOKIE');
    
curl_multi_add_handle($mh,$ch[$flow]);

  }

$flows=null;
  do {
  
curl_multi_exec($mh,$flows);
  
$info=curl_multi_info_read($mh);
  
print_rcurl_multi_info_read$mh ) );
  print(
$flows.' '.$info.'<br>');
        if(
$info){
        
$cc $info['handle'];
        print(
$flows.' '.$cc.'<br>');
        
$done_url curl_getinfo($ccCURLINFO_EFFECTIVE_URL);
        
$done_content curl_multi_getcontent($cc);
        
curl_setopt($cc,CURLOPT_URL,'my.php');
        
$res=curl_multi_getcontent($cc);
        
curl_multi_remove_handle($mh,$cc);
        
curl_multi_add_handle($mh,$cc);
        
curl_multi_exec($mh,$flows);
        }


 } while(
$flows>0);

  
curl_multi_close($mh); 
он один раз проходит по 10 заданиям и останавливается
в чем ошибка?
пытался проследить значения массива print_r( curl_multi_info_read( $mh ) );
ничего не показывает (должен ли?)
digg на форуме  
Старый 08.09.2009, 03:49   #2
XeonN
/dev/null
 
Аватар для XeonN
 
Регистрация: 16.09.2008
Адрес: Мариуполь / Украина
Сообщений: 805
Бабло: $2302714
Отправить сообщение для XeonN с помощью ICQ
По умолчанию

Если не ошибаюсь (а могу) курл не может так делать, он пачками открывает потоки и так-же закрывает, поправте если не так

З.Ы. Сокеты рулят
XeonN вне форума  
Старый 08.09.2009, 09:48   #3
mavook
Профи Интернет коммерции
 
Аватар для mavook
 
Регистрация: 04.04.2007
Сообщений: 2,344
Бабло: $456535
По умолчанию

погугли насчет multicurl.class.php
там все окейно в плане потоков
mavook вне форума  
Старый 08.09.2009, 14:17   #4
digg
$400
 
Аватар для digg
 
Регистрация: 17.05.2009
Сообщений: 13,949
Бабло: $1895460
ТС -->
Отправить сообщение для digg с помощью ICQ
автор темы ТС По умолчанию

Цитата:
Сообщение от mavook Посмотреть сообщение
погугли насчет multicurl.class.php
там все окейно в плане потоков
многопоточности в пхп нет
да и мультикурл - глючное гавно
по сути курл - это функции над теми же сокетами
в сокетах есть асинхронная работа, но надо тотестить
digg на форуме  
Старый 08.09.2009, 15:02   #5
dveredel
Читатель
 
Аватар для dveredel
 
Регистрация: 23.11.2007
Сообщений: 420
Бабло: $48745
По умолчанию

Ты один и тот же курл-объект удаляешь и добавляешь.
Надо НЕ переназначать хандлер, а создавать новый, иначе глюков не оберешься.
Т.е. для отработанного потока делать curl_multi_remove_handle, потом curl_close и открывать (и добавлять в мультик) с нуля.

И вобще приведенная тобой реализация кривоватая, к сожалению времени нет сейчас разбираться подробнее и рыться в свое библиотеке мультикурла (в которой точно все в порядке с потоками)

ЗЫ А насчет сокетов и мультикурла я тут (вроде бы) недавно подробно писал, поищите топик.
dveredel вне форума  
Старый 08.09.2009, 17:13   #6
digg
$400
 
Аватар для digg
 
Регистрация: 17.05.2009
Сообщений: 13,949
Бабло: $1895460
ТС -->
Отправить сообщение для digg с помощью ICQ
автор темы ТС По умолчанию

Цитата:
Сообщение от dveredel Посмотреть сообщение
Ты один и тот же курл-объект удаляешь и добавляешь.
Надо НЕ переназначать хандлер, а создавать новый, иначе глюков не оберешься.
Т.е. для отработанного потока делать curl_multi_remove_handle, потом curl_close и открывать (и добавлять в мультик) с нуля.
проблема не в том

PHP код:
curl_multi_exec($mh,$flows);
  
$info curl_multi_info_read($mh); 
вот эта связка не дает никакой информации о том, что процесс завершен и т.п. глухо, как в танке
процессы заканчиваются, а эта функция молчит, хотя все пишут в примерах, что она должна возвращать массив о том, какой из процессов завершен и тп

а ваще я плюнул на все это и сделал через жопу
запускаю в браузере обновляющийся яваскриптом раз в 5 мин файл, который запускает сразу процессов 5000
пхп за одно обновление съедает 25% из моих 4х процов, ну и память там что-то тоже
но канал загружает под завязку, прям как апостер ))
digg на форуме  
Старый 08.09.2009, 17:27   #7
kanscx
Senior Member
 
Аватар для kanscx
 
Регистрация: 03.04.2007
Адрес: www.ua
Сообщений: 3,209
Бабло: $373635
По умолчанию

Цитата:
Сообщение от XeonN Посмотреть сообщение
З.Ы. Сокеты рулят
+100
kanscx вне форума  
Старый 08.09.2009, 17:28   #8
dveredel
Читатель
 
Аватар для dveredel
 
Регистрация: 23.11.2007
Сообщений: 420
Бабло: $48745
По умолчанию

Цитата:
Сообщение от digg Посмотреть сообщение
вот эта связка не дает никакой информации о том, что процесс завершен и т.п. глухо, как в танке
процессы заканчиваются, а эта функция молчит, хотя все пишут в примерах, что она должна возвращать массив о том, какой из процессов завершен и тп
Дык поэтому и не дает информации никакой после первых (десяти?) потоков - остальные то ты некорректно добавил.
dveredel вне форума  
Старый 08.09.2009, 17:33   #9
digg
$400
 
Аватар для digg
 
Регистрация: 17.05.2009
Сообщений: 13,949
Бабло: $1895460
ТС -->
Отправить сообщение для digg с помощью ICQ
автор темы ТС По умолчанию

Цитата:
Сообщение от dveredel Посмотреть сообщение
Дык поэтому и не дает информации никакой после первых (десяти?) потоков - остальные то ты некорректно добавил.
ну, почему же?
вот:
PHP код:
...
for(
$flow=0;$flow<$treads;$flow++) { //В этом цикле инициализируются cURL
    
curl_setopt($ch[$flow]
...
curl_multi_add_handle($mh,$ch[$flow]); 
$ch[$flow] - вот они по массиву

$ch[]=curl_init('my.php'); - вот обзываются по циклу
digg на форуме  
Старый 08.09.2009, 20:01   #10
dveredel
Читатель
 
Аватар для dveredel
 
Регистрация: 23.11.2007
Сообщений: 420
Бабло: $48745
По умолчанию

Я вобще то про эту часть:
Код:
 curl_setopt($cc,CURLOPT_URL,'my.php'); 
        $res=curl_multi_getcontent($cc); 
        curl_multi_remove_handle($mh,$cc); 
        curl_multi_add_handle($mh,$cc); 
        curl_multi_exec($mh,$flows);
Там, после получения данных из объекта курла, в мультикурл добавляется ЭТОТ ЖЕ ХАНДЛЕР. А это не работает так как ожидается.
Т.е. нужно принудительно закрыть хандлер (curl_close), создать НОВЫЙ (curl_init), и ЕГО уже добавлять в мультикурл.
dveredel вне форума