Перейти к содержимому

MOAB

- - - - -

Вопрос про curl и многопоточность.


  • Войдите, чтобы ответить
Сообщений в теме: 3

#1 protector

protector

    Почетный

  • Основатель
  • PipPipPipPipPip
  • 3 917 сообщений
2 519
  • ИзСанкт-Петербурга

Отправлено 28 Сентябрь 2022 - 20:50

На пхп нужен небольшой скрипт по парсингу урлов страниц из интернета в многопоточном режиме. Написал небольшую функцию "muti_thread_request", которой передаю массив из урлов, а она с помощью curl заходит на страницы и скачивает их. Работает хорошо.

Дальше решил усовершествовать скрипт и написать небольшой класс("Multicurl"), чтобы удобнее было обращаться. Класс в основном состоит из 2х функций:
- start
- muti_thread_request
Внутри функции "start" обращаюсь к "muti_thread_request". Вроде должно быть всё норм.


Там, где нужно, обращаюсь к данному классу
$multi=new Multicurl();
$ret=$multi->start();

Внутри start() написано
public function start(){
...
$output_arr=$this->muti_thread_request($urls_arr);
...
}
public function muti_thread_request($nodes){
        $mh = curl_multi_init();
        $curl_array = array();

        foreach($nodes as $i => $url)
        {
            $curl_array[$i] = curl_init($url);
           curl_setopt($curl_array[$i], CURLOPT_COOKIESESSION, true);
            curl_setopt($curl_array[$i], CURLOPT_RETURNTRANSFER, true);
             curl_setopt($curl_array[$i], CURLOPT_CONNECTTIMEOUT, 8);
           curl_setopt($curl_array[$i], CURLOPT_TIMEOUT, 12);
            curl_multi_add_handle($mh, $curl_array[$i]);
        }

        $running = NULL;
        do {
            curl_multi_exec($mh,$running);
        } while($running > 0);
        foreach($nodes as $id => $url)
        {
                 $head_info=curl_getinfo($curl_array[$id]);
                 print_r ($head_info); //Выводит нули.
        }
}


При таком обращении скрипт не скачивает нужные мне страницы. Ответ - ноль.
Но если обратиться напрямую, как ниже, то всё работает.
Multicurl::muti_thread_request($urls_arr);

Почему так?
Кратко:
Если обращаюсь напрямую к функции muti_thread_request с "curl_multi_exec", то всё работает.
Если обращаюсь к функции start, которая обращается к muti_thread_request, то уже не работает.

Нужно более подробный код выложить?

#2 KaSH

KaSH

    Инструктор по счастью

  • Основатель
  • PipPipPipPip
  • 1 432 сообщений
2 643
  • Изморя и с гор

Отправлено 28 Сентябрь 2022 - 22:06

$urls_arr определяется где? Везде переменные правильно передаются в функции?
И... какие есть проблемы в таких случаях пройтись дебагером?
Серьезные сайты размещаю на VPS, простые в SprintHost и в TimeWeb. Старые, более ненужные мне сайты я продаю на Телдери. Бухгалтерию и отчеты в налоговую за меня делает Эльба.

#3 c4e8ece0

c4e8ece0

    Ниггер на лошади

  • Участник
  • PipPipPipPipPip
  • 5 376 сообщений
6 936
  • Изцирка

Отправлено 29 Сентябрь 2022 - 11:06

Полный код класса покажь
"Они не могут ничего, у них лапки котят"

#4 protector

protector

    Почетный

  • Основатель
  • PipPipPipPipPip
  • 3 917 сообщений
2 519
  • ИзСанкт-Петербурга

TC Отправлено 29 Сентябрь 2022 - 11:14

Просмотр сообщенияKaSH (28 Сентябрь 2022 - 22:06) писал:

$urls_arr определяется где? Везде переменные правильно передаются в функции?
И... какие есть проблемы в таких случаях пройтись дебагером?
Дебагером проходился - ошибок нет.

Но вчера ночью нашел. Урлы в базе данных ($urls_arr, которые использовал для класса) в конце содержали "пробел" либо какой-то невидимый символ. Из-за этого пробела отдавал http header ноль, а не 200.
Почти весь день потратил на поиск данной ошибки. :angry:

Спасибо за наводку.



Похожие темы


Количество пользователей, читающих эту тему: 2

0 пользователей, 2 гостей, 0 анонимных



© 2022 SMO&SEO форум «WEBIMHO» — продвижение и создание сайтов, интернет-маркетинг

По вопросам рекламы на форуме и цены на рекламу
Все материалы SEO форума разрешены к копированию только с установкой гиперактивной ссылки на webimho.ru,
тем, кто этого не сделает, мы оторвем руки и ноги и поменяем местами,
а когда выйдем из тюрьмы, опять оторвем и опять поменяем.


Россия, г. Москва
  • Top.Mail.Ru

Мы в соцсетях: twitter | вконтакте | facebook | livejournal