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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Многопоточность в curl, всё не так просто 
:(
    Опции темы
Randomm
Дата 31.8.2007, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Проблема.
Есть класс для эмуляции браузера, написанный с использованием курла. То есть там есть например функции get, post и т.п.
Есть ряд функций, каждая из которых работает с  определённым сайтом, используя эти самые get и post, и между их использованием как-то обрабатывает полученную информацию.

Задача.
Запустить эти функции в несколько потоков.
Сразу напрашивается использование curl_multi, однако тот факт, что в каждой из функций get и post использовано по несколько раз, всё портит. То есть за время работы функции делает curl_init, curl_exec и curl_close.

Нашёл на пхп.нет пример работы с мультикурлом:
http://ru2.php.net/manual/en/function.curl-multi-exec.php
Код

<?php 
$connomains = array( 
   "http://www.cnn.com/", 
   "http://www.canada.com/", 
   "http://www.yahoo.com/" 
); 

$mh = curl_multi_init(); 

foreach ($connomains as $i => $url) { 
  $conn[$i] = curl_init($url); 
  curl_setopt($conn[$i], CURLOPT_RETURNTRANSFER, 1); 
  curl_multi_add_handle ($mh,$conn[$i]); 


// start performing the request 
do { 
  $mrc = curl_multi_exec($mh, $active); 
} while ($mrc == CURLM_CALL_MULTI_PERFORM); 

while ($active and $mrc == CURLM_OK) { 
  // wait for network 
  if (curl_multi_select($mh) != -1) { 
    // pull in any new data, or at least handle timeouts 
    do { 
      $mrc = curl_multi_exec($mh, $active); 
    } while ($mrc == CURLM_CALL_MULTI_PERFORM); 
  } 


if ($mrc != CURLM_OK) { 
  print "Curl multi read error $mrc\n"; 


// retrieve data 
foreach ($connomains as $i => $url) { 
  if (($err = curl_error($conn[$i])) == '') { 
    $res[$i]=curl_multi_getcontent($conn[$i]); 
  } else { 
    print "Curl error on handle $i: $err\n"; 
  } 
  curl_multi_remove_handle($mh,$conn[$i]); 
  curl_close($conn[$i]); 

curl_multi_close($mh); 

print_r($res); 
?>

но я так понимаю, что для моего случая он не подходит, ибо нельзя в поток после curl_close($conn[$i]); добавлять новый curl_init(); 

Собственно вопрос, как наименьшими жертвами добиться нужного результата? можно ли как-то эти функции запустить в несколько потоков?
PM MAIL   Вверх
Randomm
Дата 7.9.2007, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Прям совсем никто не знает?
PM MAIL   Вверх
WolfON
Дата 7.9.2007, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



можно запустить несколько экземпляров одного скрипта
PM MAIL ICQ   Вверх
Golda
Дата 9.9.2007, 07:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 26.3.2007
Где: Ариель, Израиль

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



Цитата(WolfON @  7.9.2007,  22:45 Найти цитируемый пост)
можно запустить несколько экземпляров одного скрипта


А скрипт будет выбирать, например, из базы данных, первый адрес, помеченный как еще не обработанный.


--------------------
"For every problem, there exists a simple and elegant solution which is absolutely wrong." -- J. Wagoner, U.C.B. Mathematics
PM MAIL   Вверх
dracs
Дата 12.9.2007, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


php



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

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



Только если запускаешь несколько экземпляров 1-го скрипта не забывай про куки если ложишь их в файл для дальнейшего использования - каждый скрипт должен хратить в разных куки-файлах. Тоже грабли были.
PM WWW ICQ Skype GTalk Jabber YIM MSN   Вверх
Валерия
Дата 9.12.2007, 03:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну вообще идеальный вариант, сделать демона, который запустит несколько копий скрипта, и который будет раздавать через сокеты "задания", а они, когда выполняют, опять садятся на прослушку smile
Я когдато давно делала такое... Потом забила, нормальные потоки не сделаешь в php )
PM MAIL   Вверх
sTa1kEr
Дата 11.1.2008, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


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

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



Еще вариант - не использовать курл, а реализовать все самому на сокетах. Пример http://forum.vingrad.ru/topic-159049.html
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Сеть | Следующая тема »


 




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


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

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