Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Multi Curl

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Продолжается выполнение скрипта без ожидания результатов
Angelolog
Отправлено: 20 Июня, 2011 - 11:27:45
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Июнь 2011  


Помог: 0 раз(а)




Проблема такова!
Есть скрипт содержащий мультикурл... При выполнении кода мультикурл начинает своё выполнение
но не заканчивая его переходит к следующей операции... В чём может быть баг? Подскажите, пожалуйста! Заранее благодарен!
 
 Top
Давит
Отправлено: 20 Июня, 2011 - 11:29:38
Post Id



Частый гость


Покинул форум
Сообщений всего: 147
Дата рег-ции: Май 2011  


Помог: 2 раз(а)




из мультикурл
 
 Top
OrmaJever Модератор
Отправлено: 20 Июня, 2011 - 12:12:19
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Angelolog пишет:
При выполнении кода мультикурл начинает своё выполнение
но не заканчивая его переходит к следующей операции...

Почему решили что не заканчивает? Как написан код?
http://www.php.net/manual/ru/fun...l-multi-init.php

(Отредактировано автором: 20 Июня, 2011 - 12:18:12)



-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Angelolog
Отправлено: 20 Июня, 2011 - 13:06:25
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Июнь 2011  


Помог: 0 раз(а)




Он запускается, продолжает выполнение но в бэкграунде!
И сразу же выполняет скрипт дальше не дожидаясь результата мультикурла.
ТО есть одновременно работает запущенный мультикурл и идёт дальнейшее выполнение скрипта!
 
 Top
OrmaJever Модератор
Отправлено: 20 Июня, 2011 - 13:47:06
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




OrmaJever пишет:
Как написан код?

Однако


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Мелкий Супермодератор
Отправлено: 20 Июня, 2011 - 14:13:27
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Angelolog пишет:
ТО есть одновременно работает запущенный мультикурл и идёт дальнейшее выполнение скрипта!

Ну так укажите ждать:
PHP:
скопировать код в буфер обмена
  1. $running=null;
  2. //запускаем дескрипторы
  3. do {
  4.     usleep(10000);
  5.     curl_multi_exec($mh,$running);
  6. } while ($running > 0);

Код взят из уже приведённой ссылки http://www.php.net/manual/ru/fun...l-multi-init.php


-----
PostgreSQL DBA
 
 Top
Angelolog
Отправлено: 20 Июня, 2011 - 14:22:39
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Июнь 2011  


Помог: 0 раз(а)




PHP:
скопировать код в буфер обмена
  1. function m_curl($tasks){
  2. $cmh = curl_multi_init();
  3. $tasks_curl = array();
  4. foreach ($tasks as $task) {
  5.     $ch = curl_init($task);
  6.     curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  7.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  8.     curl_setopt($ch, CURLOPT_HEADER, 0);
  9.     curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);
  10.     curl_setopt($ch, CURLOPT_TIMEOUT, 60);
  11.     $tasks_curl[$task] = $ch;
  12.     curl_multi_add_handle($cmh, $ch);
  13. }
  14. $active = null;
  15. do {
  16.     $mrc = curl_multi_exec($cmh, $active);
  17. }
  18. while ($mrc == CURLM_CALL_MULTI_PERFORM);
  19. while ($active && ($mrc == CURLM_OK)) {
  20.     if (curl_multi_select($cmh) != -1) {
  21.         do {
  22.             $mrc = curl_multi_exec($cmh, $active);
  23.             $info = curl_multi_info_read($cmh);
  24.             if ($info['msg'] == CURLMSG_DONE) {
  25.                 $ch = $info['handle'];
  26.                 $task = array_search($ch, $tasks_curl);
  27.                 $tasks_curl[$task] = curl_multi_getcontent($ch);
  28.                 curl_multi_remove_handle($cmh, $ch);
  29.                 curl_close($ch);
  30.             }
  31.         }
  32.         while ($mrc == CURLM_CALL_MULTI_PERFORM);
  33.     }
  34. }
  35. return 0;
  36. }


Что нужно здесь поправить, чтобы в дальнейшем когда я воспользуюсь функцией m_curl она ждала своего завершения?
 
 Top
vsll
Отправлено: 20 Июня, 2011 - 14:43:29
Post Id


Частый посетитель


Покинул форум
Сообщений всего: 530
Дата рег-ции: Февр. 2011  


Помог: 10 раз(а)




Из-за вот этого if (curl_multi_select($cmh) != -1)
http://www.php.net/manual/ru/fun...multi-select.php
 
 Top
Angelolog
Отправлено: 20 Июня, 2011 - 14:58:13
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Июнь 2011  


Помог: 0 раз(а)




Если кому-то не лень, напишите пожалуйста как правильно, чтоб на будующее знать а то 4 дня уже бьюсь головою об стенку! Заранее благодарю!
 
 Top
vsll
Отправлено: 20 Июня, 2011 - 15:02:40
Post Id


Частый посетитель


Покинул форум
Сообщений всего: 530
Дата рег-ции: Февр. 2011  


Помог: 10 раз(а)




http://php.su/forum/topic.php?forum=62&topic=31#
Вопрос, зачем вам curl_multi_select? Если это принципиально, то надо подумать над тем чтобы вклинить в цикл break по истечении определённого количества времени

(Отредактировано автором: 20 Июня, 2011 - 15:03:07)

 
 Top
Angelolog
Отправлено: 20 Июня, 2011 - 15:13:32
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Июнь 2011  


Помог: 0 раз(а)




PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. function m_curl($tasks){
  3. $cmh = curl_multi_init();
  4. $tasks_curl = array();
  5. foreach ($tasks as $task) {
  6.     $ch = curl_init($task);
  7.     curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  8.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  9.     curl_setopt($ch, CURLOPT_HEADER, 0);
  10.     curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);
  11.     curl_setopt($ch, CURLOPT_TIMEOUT, 60);
  12.     $tasks_curl[$task] = $ch;
  13.     curl_multi_add_handle($cmh, $ch);
  14. }
  15. $active = null;
  16. do {
  17.     $mrc = curl_multi_exec($cmh, $active);
  18. }
  19. while ($active > 0);
  20. ////////////////////////////////////////////////
  21. ////////////////////////////////////////////
  22.  
  23. return 0;
  24. }


А если переписать так??? То что должно быть тут на месте .////////////////////////
 
 Top
vsll
Отправлено: 20 Июня, 2011 - 15:28:44
Post Id


Частый посетитель


Покинул форум
Сообщений всего: 530
Дата рег-ции: Февр. 2011  


Помог: 10 раз(а)




Если под ваш случай то просто уберите if c селектом:
PHP:
скопировать код в буфер обмена
  1. function m_curl($tasks){
  2. $cmh = curl_multi_init();
  3. $tasks_curl = array();
  4. foreach ($tasks as $task) {
  5.     $ch = curl_init($task);
  6.     curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  7.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  8.     curl_setopt($ch, CURLOPT_HEADER, 0);
  9.     curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);
  10.     curl_setopt($ch, CURLOPT_TIMEOUT, 60);
  11.     $tasks_curl[$task] = $ch;
  12.     curl_multi_add_handle($cmh, $ch);
  13. }
  14. $active = null;
  15. do {
  16.     $mrc = curl_multi_exec($cmh, $active);
  17. }
  18. while ($mrc == CURLM_CALL_MULTI_PERFORM);
  19. while ($active && ($mrc == CURLM_OK)) {
  20.    
  21.         do {
  22.             $mrc = curl_multi_exec($cmh, $active);
  23.             $info = curl_multi_info_read($cmh);
  24.             if ($info['msg'] == CURLMSG_DONE) {
  25.                 $ch = $info['handle'];
  26.                 $task = array_search($ch, $tasks_curl);
  27.                 $tasks_curl[$task] = curl_multi_getcontent($ch);
  28.                 curl_multi_remove_handle($cmh, $ch);
  29.                 curl_close($ch);
  30.             }
  31.         }
  32.         while ($mrc == CURLM_CALL_MULTI_PERFORM);
  33.    
  34. }
  35. return 0;
  36. }

Если вам нужно просто пройтись по урлам то из приведённой мной ссылки простой и на 100% рабочий пример:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. function multiCurl($data, $options = array())
  3. {
  4.  
  5.   $curls = array();
  6.   // Массив дескрипторов. Библиотека создат много экземпляров своего
  7.   // механизма, но работать они будут параллельно
  8.  
  9.   $result = array();
  10.   // массив с результатами запрошенных страниц которые наша функция вернет.
  11.  
  12.   $mh = curl_multi_init();
  13.   // Дескриптор мульти потока. Тоесть эта штука отвечает за то, чтобы много
  14.   // запросов шли параллельно.
  15.  
  16.   foreach ($data as $id => $d) {
  17.  
  18.     $curls[$id] = curl_init();
  19.         // Для каждого url создаем отдельный curl механизм чтоб посылал запрос)
  20.  
  21.         $url = (is_array($d) && !empty($d['url'])) ? $d['url'] : $d;
  22.         // Если $d это массив (как в случае с пост), то достаем из массива url
  23.         // если это не массив, а уже ссылка - то берем сразу ссылку
  24.  
  25.         curl_setopt($curls[$id], CURLOPT_URL,            $url);
  26.     curl_setopt($curls[$id], CURLOPT_HEADER,         0);
  27.     curl_setopt($curls[$id], CURLOPT_RETURNTRANSFER, 1);
  28.  
  29.     // Если у нас есть пост данные, тоесть запрос отправляется постом
  30.         // устанавливаем флаги и добавляем сами данные
  31.     if (is_array($d) && !empty($d['post']))
  32.         {
  33.         curl_setopt($curls[$id], CURLOPT_POST,       1);
  34.         curl_setopt($curls[$id], CURLOPT_POSTFIELDS, $d['post']);
  35.     }
  36.  
  37.  
  38.     // Если указали дополнительные параметры $options то устанавливаем их
  39.         // смотри документацию функции curl_setopt_array
  40.     if (count($options)>0) curl_setopt_array($curls[$id], $options);
  41.  
  42.         // добавляем текущий механизм к числу работающих параллельно
  43.     curl_multi_add_handle($mh, $curls[$id]);
  44.   }
  45.  
  46.   // число работающих процессов.
  47.   $running = null;
  48.  
  49.   // curl_mult_exec запишет в переменную running количество еще не завершившихся
  50.   // процессов. Пока они есть - продолжаем выполнять запросы.
  51.   do { curl_multi_exec($mh, $running); } while($running > 0);
  52.  
  53.   // Собираем из всех созданных механизмов результаты, а сами механизмы удаляем
  54.   foreach($curls as $id => $c)
  55.   {
  56.     $result[$id] = curl_multi_getcontent($c);
  57.     curl_multi_remove_handle($mh, $c);
  58.   }
  59.  
  60.   // Освобождаем память от механизма мультипотоков
  61.  
  62.   // возвращаем данные собранные из всех потоков.
  63.   return $result;
  64. }
  65.  
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с сетью »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB