Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Сеть > Многопоточность в curl


Автор: Randomm 31.8.2007, 18:14
Проблема.
Есть класс для эмуляции браузера, написанный с использованием курла. То есть там есть например функции 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(); 

Собственно вопрос, как наименьшими жертвами добиться нужного результата? можно ли как-то эти функции запустить в несколько потоков?

Автор: Randomm 7.9.2007, 18:41
Прям совсем никто не знает?

Автор: WolfON 7.9.2007, 22:45
можно запустить несколько экземпляров одного скрипта

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


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

Автор: dracs 12.9.2007, 00:16
Только если запускаешь несколько экземпляров 1-го скрипта не забывай про куки если ложишь их в файл для дальнейшего использования - каждый скрипт должен хратить в разных куки-файлах. Тоже грабли были.

Автор: Валерия 9.12.2007, 03:20
Ну вообще идеальный вариант, сделать демона, который запустит несколько копий скрипта, и который будет раздавать через сокеты "задания", а они, когда выполняют, опять садятся на прослушку smile
Я когдато давно делала такое... Потом забила, нормальные потоки не сделаешь в php )

Автор: sTa1kEr 11.1.2008, 19:11
Еще вариант - не использовать курл, а реализовать все самому на сокетах. Пример http://forum.vingrad.ru/topic-159049.html

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)