|
| Дата |
|
USD/RUB | 93.4409 | BTC/USD | 64727.8860 |
|
|
|
Скрипты, программы и технические решения Обсуждаем скрипты, программы и новые технологии. |
07.09.2009, 23:47
|
#1
|
$400
Регистрация: 17.05.2009
Сообщений: 13,949
Бабло: $1895460
|
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_r( curl_multi_info_read( $mh ) );
print($flows.' '.$info.'<br>');
if($info){
$cc = $info['handle'];
print($flows.' '.$cc.'<br>');
$done_url = curl_getinfo($cc, CURLINFO_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 ) );
ничего не показывает (должен ли?)
|
|
|
08.09.2009, 03:49
|
#2
|
/dev/null
Регистрация: 16.09.2008
Адрес: Мариуполь / Украина
Сообщений: 805
Бабло: $2302714
|
Если не ошибаюсь (а могу) курл не может так делать, он пачками открывает потоки и так-же закрывает, поправте если не так
З.Ы. Сокеты рулят
|
|
|
08.09.2009, 09:48
|
#3
|
Профи Интернет коммерции
Регистрация: 04.04.2007
Сообщений: 2,344
Бабло: $456535
|
погугли насчет multicurl.class.php
там все окейно в плане потоков
|
|
|
08.09.2009, 14:17
|
#4
|
$400
Регистрация: 17.05.2009
Сообщений: 13,949
Бабло: $1895460
ТС -->
|
ТС
Цитата:
Сообщение от mavook
погугли насчет multicurl.class.php
там все окейно в плане потоков
|
многопоточности в пхп нет
да и мультикурл - глючное гавно
по сути курл - это функции над теми же сокетами
в сокетах есть асинхронная работа, но надо тотестить
|
|
|
08.09.2009, 15:02
|
#5
|
Читатель
Регистрация: 23.11.2007
Сообщений: 420
Бабло: $48745
|
Ты один и тот же курл-объект удаляешь и добавляешь.
Надо НЕ переназначать хандлер, а создавать новый, иначе глюков не оберешься.
Т.е. для отработанного потока делать curl_multi_remove_handle, потом curl_close и открывать (и добавлять в мультик) с нуля.
И вобще приведенная тобой реализация кривоватая, к сожалению времени нет сейчас разбираться подробнее и рыться в свое библиотеке мультикурла (в которой точно все в порядке с потоками)
ЗЫ А насчет сокетов и мультикурла я тут (вроде бы) недавно подробно писал, поищите топик.
|
|
|
08.09.2009, 17:13
|
#6
|
$400
Регистрация: 17.05.2009
Сообщений: 13,949
Бабло: $1895460
ТС -->
|
ТС
Цитата:
Сообщение от dveredel
Ты один и тот же курл-объект удаляешь и добавляешь.
Надо НЕ переназначать хандлер, а создавать новый, иначе глюков не оберешься.
Т.е. для отработанного потока делать curl_multi_remove_handle, потом curl_close и открывать (и добавлять в мультик) с нуля.
|
проблема не в том
PHP код:
curl_multi_exec($mh,$flows); $info = curl_multi_info_read($mh);
вот эта связка не дает никакой информации о том, что процесс завершен и т.п. глухо, как в танке
процессы заканчиваются, а эта функция молчит, хотя все пишут в примерах, что она должна возвращать массив о том, какой из процессов завершен и тп
а ваще я плюнул на все это и сделал через жопу
запускаю в браузере обновляющийся яваскриптом раз в 5 мин файл, который запускает сразу процессов 5000
пхп за одно обновление съедает 25% из моих 4х процов, ну и память там что-то тоже
но канал загружает под завязку, прям как апостер ))
|
|
|
08.09.2009, 17:27
|
#7
|
Senior Member
Регистрация: 03.04.2007
Адрес: www.ua
Сообщений: 3,209
Бабло: $373635
|
Цитата:
Сообщение от XeonN
З.Ы. Сокеты рулят
|
+100
|
|
|
08.09.2009, 17:28
|
#8
|
Читатель
Регистрация: 23.11.2007
Сообщений: 420
Бабло: $48745
|
Цитата:
Сообщение от digg
вот эта связка не дает никакой информации о том, что процесс завершен и т.п. глухо, как в танке
процессы заканчиваются, а эта функция молчит, хотя все пишут в примерах, что она должна возвращать массив о том, какой из процессов завершен и тп
|
Дык поэтому и не дает информации никакой после первых (десяти?) потоков - остальные то ты некорректно добавил.
|
|
|
08.09.2009, 17:33
|
#9
|
$400
Регистрация: 17.05.2009
Сообщений: 13,949
Бабло: $1895460
ТС -->
|
ТС
Цитата:
Сообщение от 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'); - вот обзываются по циклу
|
|
|
08.09.2009, 20:01
|
#10
|
Читатель
Регистрация: 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), и ЕГО уже добавлять в мультикурл.
|
|
|
|