![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
burakov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Добрый день.
необходимо прервать соединение LWP по таймауту. родной $lwp -> timeout ($timeout); это для того, чтобы не останавливаться, когда ждешь ответа сервера .. но бывают ситуации, когда ответ есть, но очень медленный. такие ответы нужно прерывать по таймауту есть ли в LWP такая опция? попробовал использовать в своем многопоточном грабере конструкцию вида my $response = undef; eval { local $SIG{ALRM} = sub { die "timeout"; }; alarm ($timeout); UNSAFE_SIGNALS { $response = $lwp -> request ($req); }; if (defined $response -> code) { print $response -> code ."\t". scalar (@threads). "\t" .$url. "\n"; } alarm (0); }; но в виндоус она не работает. в линукс работает, но eval обрывает все потоки и останавливает грабер вообщем вообще работает некорректно многопоточная работа основана на use threads; use threads::shared; use Thread::Queue; подскажите как быть кто где и как (многопоточно) реализовывал обрыв соединения по таймауту?? большое спасибо |
|||
|
||||
Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: нет Всего: 57 |
эээ... имеешь ввиду узкий канал?? -------------------- менеджер по кодеврайтингу ![]() |
|||
|
||||
burakov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
совершенно верно.
бывает канал сам по себе узкий. а бывает его преднамеренно сужают... ![]() но мне нужно просто оборвать в таком случае выполнение запроса и продолжить дальше. |
|||
|
||||
Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: нет Всего: 57 |
а ежели через fork попробовать? -------------------- менеджер по кодеврайтингу ![]() |
|||
|
||||
burakov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
ну можно попробовать через fork,
можно через wget на крайний случай. хотелось волшебное решение через LWP, чтобы двиг не переписывать. (тем более все должно и на винде работать, а форки в винде по моему еще хуже чем threads) |
|||
|
||||
Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: нет Всего: 57 |
burakov, ну выложи более подробный код, а то по кускам все ж не до конца понятно, где и что можно изменить.
Добавлено через 40 секунд
для граббера сойдет -------------------- менеджер по кодеврайтингу ![]() |
|||
|
||||
krypt3r |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 359 Регистрация: 9.6.2009 Репутация: нет Всего: 16 |
Может поможет
|
|||
|
||||
vadiml |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 27.7.2007 Репутация: нет Всего: 7 |
Если у Вас коннект по https, то в LWP есть с timeout-ом баг
http://stackoverflow.com/questions/9400068...useragent-https Т.е. надо писать timeout => 5, Timeout => 5 |
|||
|
||||
Pfailed |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 2 Всего: 39 |
Его же пофиксили давно, там даже написано. А что касается LWP, то вся соль здесь https://metacpan.org/source/GAAS/libwww-per...ol/http.pm#L128 Соответственно для реализациии dead line таймаута потребуется либо реализовать свой имплементор для http и https схемы, унаследовавшись от LWP::Protocol::http и LWP::Protoco::https сответственно и переопределив метод request. Либо переопределить LWP::Protocol::http::request напрямую monkey патчингом. |
|||
|
||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 4 Всего: 49 |
В обсуждении на stackoverflow.com посоветовали LWPx::ParanoidAgent, в нем реализован общий timeout().
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
Pfailed |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 2 Всего: 39 |
ginnie, он там реализован как раз с помощью SIGALRM
Я тут придумал как это можно сделать дёшево и сердито. Делаем tied handle, который при каждом read/write проверяет а не наступил ли таймаут (прошло больше времени, чем задано). Если прошло возвращает ошибку. Далее нужно связать с этим умным handl'ом сокет, который создаёт LWP. Это можно легко сделать подменив IO::Socket::INET::new на наш со связыванием (локализовав эту подмену внутри функции, где LWP создаёт сокет). Далее тестовый скрипт, показавший, что это более менее работает. При установленном таймауте 3 секунды проходит 4. А на простом LWP все 10 (собственно столько создаваемый сервер и отдаёт контент). На винде тоже работает.
Добавлено через 3 минуты и 41 секунду ginnie, прошу прощенья. Перепутал с LWP::UserAgent::Paranoid |
|||
|
||||
Pfailed |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 2 Всего: 39 |
Да, на моём тесте LWPx::ParanoidAgent выдал ровно 3 отведённые ему секунды. Можно рекомендовать к использованию.
|
|||
|
||||
burakov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
посоветовали еще WGET
--connect-timeout=СЕК установка тайм-аута подключения в СЕК. --read-timeout=СЕК установка тайм-аута чтения в СЕК. попробовал
но коннект не обрывает. а это вроде все таймауты, которые у него есть. просто по идее грабер должен кроссплатформенно виндоус, линукс работать.. а под виндоусом alarm не особо на многопотоке. как то можно оборвать по таймауту wget соединение? |
|||
|
||||
Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: нет Всего: 57 |
ну там еще и dns-timeout был(что-то вроде этого), хотя это наверно зависит еще и от самой оси, у меня на убунту по крайней мере что-то такое есть. В других не знаю. Но на тему wget тогда у меня вопрос - разве его винда поддерживает? -------------------- менеджер по кодеврайтингу ![]() |
|||
|
||||
burakov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
ну есть сборка win32, а как же.
но че то не работает обрыв (по крайней мере видно это не те таймауты) пришлось даже админа знакомого упросить смоделировать на линуксе ситуацию на моем ай пи. wget не обрывает, хотя было бы удобно его как клиента получающего контент использовать |
|||
|
||||
Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: нет Всего: 57 |
burakov, что-то больно сложный велосипед у тебя получается. Чем тебе не нравится предложенный мною ранее способ - fork? Создаешь дочерние процессы и вешаешь тот же аларм на весь дочерний процесс, если висит слишком долго - помрет без каких-либо последствий для родительского процесса. Да и под винду такой фокус должен сработать.
![]() -------------------- менеджер по кодеврайтингу ![]() |
|||
|
||||
burakov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
УРА!!
LWPx::ParanoidAgent работает даже под виндой и в многопоточном режиме !! супер !!! то что мне нужно, чтобы особо не заморачиваться с сигналами. не понимаю почему такая нужная вещь не реализована сразу в LWP и бем более нет ее в WGET! огромное спасибо! p.s. сразу не заметил 2ю страницу ответов. *про fork * ну я ж не против нужно пробовать. на данный момент просто был собран движок многопоточно на threadth + lwp 2к строк коду. в которых я уже сам понять не могу что к чему. и нужно было быстрое решение (ибо сдавать уже вчера все это дело). подменил LWP на LWPx::ParanoidAgent и все заработало как нужно. это просто супер. ну форки. попробую конечно , но это уже будет другой двиг., другое решение и другое потраченное время. Это сообщение отредактировал(а) burakov - 18.12.2013, 14:26 |
|||
|
||||
burakov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Люди!
а вот под линукс он не лезет пробую perl -MCPAN -e shell install LWPx::ParanoidAgent не ставиться , потому что не может установиться пакет Net::SSL ставлю на дебиан 6,0 подскажите, что делать? как установить его? |
|||
|
||||
Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: нет Всего: 57 |
![]() -------------------- менеджер по кодеврайтингу ![]() |
|||
|
||||
burakov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
модули засадил вот так
apt-get install libnet-ssleay-perl apt-get install libcrypt-ssleay-perl apt-get install liblwpx-paranoidagent-perl но ... хотя парсер заработал без ошибок сама функция таймауа не работает. под виндоусом главное все ок. а под линуксом нет. |
|||
|
||||
Pfailed |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 2 Всего: 39 |
обнови через cpan до последней версии. И Debian заодно, 6 уже не актуальна
|
|||
|
||||
burakov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
>>обнови через cpan до последней версии.
Net::SSL у меня не ставится через CPAN. make NO дальше ума не хватает. из за этого ничего не работает. в принципе я поставил то же самое, только в пакетах. дебиан 6,0 у меня на вдс . там другого не дают. вышел из положения при помощи wget. все таки комплекс его таймаутов обрывает по времени коннект.. это очень хорошо.
вот такая строка позволяет работать через wget но буду очень признателен, если поможете таки добить LWPx потому как на винде он работает отлично. огромное спасибо. и может быть кто подскажет..как от WGET поймать его STDOUT то есть то что он на экран показывает, мне бы поймать и разобрать (статус ответа сервера и прочее).. Это сообщение отредактировал(а) burakov - 20.12.2013, 10:38 |
|||
|
||||
krypt3r |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 359 Регистрация: 9.6.2009 Репутация: нет Всего: 16 |
Проблемы при установке Net::SSLeay (или какой там у вас) озвучьте. Наверняка не хватает пакетов. libssl-dev стоит? |
|||
|
||||
burakov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
я модули поставил вот так (тоже люди посоветовали). прямо из дистриба дебиан.
apt-get install libnet-ssleay-perl apt-get install libcrypt-ssleay-perl apt-get install liblwpx-paranoidagent-perl парсер после этого запускается без ошибок.НО все это делалось ради LWPx::ParanoidAgent а он не смог оборвать соединения по таймауту (ради чего весь сыр бор). а вот под виндой работает нормально. ставил модуль через perl -MCPAN -e shell |
|||
|
||||
krypt3r |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 359 Регистрация: 9.6.2009 Репутация: нет Всего: 16 |
Что-то каша у вас какая-то: модуль можно ставить либо через apt-get, либо через CPAN. В CPAN-е лежат более свежие версии, собираемые из исходников. Если репозиторная версия вас не устраивает, удалите ее и поставьте CPAN-овскую.
PS. Мой предыдущий пост был о проблемах установки модуля со CPAN. |
|||
|
||||
burakov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
при установке perl -MCPAN -e shell
не может корректно поставить зависимости Crypt-SSLeay-0.64.tar.gz (Net::SSL); Присоединённый файл ( Кол-во скачиваний: 2 ) ![]() |
|||
|
||||
krypt3r |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 359 Регистрация: 9.6.2009 Репутация: нет Всего: 16 |
Лучше бы полный лог. Все самое интересное — выше "Test Summary Report"
|
|||
|
||||
burakov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
ну вот. там теперь чего то стоит. чего то нет.
пришлось вот так force install LWPx::ParanoidAgent > log1.txt сделать Присоединённый файл ( Кол-во скачиваний: 1 ) ![]() |
|||
|
||||
krypt3r |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 359 Регистрация: 9.6.2009 Репутация: нет Всего: 16 |
libcrypt-ssleay-perl стоит? Попробуйте удалить его. LWPx::ParanoidAgent требует Crypt::SSLeay версии 0.64. Возможно, конфликт. Также попробуйте ставить Net::SSL отдельно либо вообще вручную (wget, tar, perl Makefile.PL, make, make test, если все норм будет, тогда make install)
|
|||
|
||||
burakov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
libcrypt-ssleay-perl
вот этого не было. на всякий случай сделал apt-get remove и попытался поставить install Crypt::SSLeay на нем выдает ошибки (пишет нет каких то библиотек) лог приложил Присоединённый файл ( Кол-во скачиваний: 2 ) ![]() |
|||
|
||||
noize |
|
|||
![]() 5.18.2 ![]() Профиль Группа: Участник Сообщений: 89 Регистрация: 10.7.2010 Где: СПб Репутация: нет Всего: 3 |
Попробуйте поставить libssl, libssl-dev и на всякий случай openssl: aptitude install libssl1.0.0 libssl-dev openssl
Это сообщение отредактировал(а) noize - 24.12.2013, 15:34 |
|||
|
||||
krypt3r |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 359 Регистрация: 9.6.2009 Репутация: нет Всего: 16 |
Ну вот видите, я же говорил проверить пакет libssl-dev |
|||
|
||||
burakov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
в итоге было поставлено
apt-get install libnet-ssleay-perl apt-get install libcrypt-ssleay-perl apt-get install libssl-dev apt-get install openssl даже потом и вот так apt-get install liblwpx-paranoidagent-perl потом все это через CPAN ставил force install (потому как говорило мне, что "уже есть") В итоге грабер запускается. работает , НО коннект по таймауту не обрывает. (знакомый админ сузил мне канал на мой ай пи, так что я точно знаю когда должно оборвать -- таймаут пставил 2 секунды) под виндой ОТЛИЧНО. через 2 секунды показывает ошибку 500 и идет дальше. под линуксом просто не работает. долбит в сайт и висит на нем из за узкого канала. Логи от 2х (как я считаю проблемных модулей приложил) они еще один от другого зависят, цепляют друг друга. могу попросить сузить канал для Вас. чтобы понятно было о чем говорю. (поднял прокси хотел всем дать пробовать, но через прокси LWPx не работает) добейте это дело. ГОРЮ! wget со своим --read_timeout как то до того хитро работает . не поймешь как оно его считает. это не таймаут по времени. а если есть перерыв в чтении .. вообщем не очень подходит. (Временно на нем пока сижу) но LWPx это то, что надо. под виндой полностью удовлетворяет, а под линуксом ни черта не работает. спасибо. Присоединённый файл ( Кол-во скачиваний: 2 ) ![]() |
|||
|
||||
Pfailed |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 2 Всего: 39 |
версию Net::HTTP, LWP::UserAgent, IO::Socket::SSL, LWPx::ParanoidAgent в студию
|
|||
|
||||
burakov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
$Net::HTTP::VERSION = 6.06 $LWP::UserAgent::VERSION = 6.05 $LWPx::ParanoidAgent::VERSION =1.10 на use IO::Socket::SSL; пишет Net::SSLeay version 1.46 required--this is only version 1.36 at /usr/local/share/perl/5.10.1/IO/Socket/SSL.pm line 17. BEGIN failed--compilation aborted at /usr/local/share/perl/5.10.1/IO/Socket/SSL.pm line 17. Compilation failed in require at ./test3.pl line 16. BEGIN failed--compilation aborted at ./test3.pl line 16. как мне именно Net::SSLeay version 1.46 поставить? я с CPAN ставлю., perl -MCPAN -e shell логи прикладываю.. Присоединённый файл ( Кол-во скачиваний: 1 ) ![]() |
|||
|
||||
noize |
|
|||
![]() 5.18.2 ![]() Профиль Группа: Участник Сообщений: 89 Регистрация: 10.7.2010 Где: СПб Репутация: нет Всего: 3 |
install MIKEM/Net-SSLeay-1.46.tar.gz
|
|||
|
||||
Pfailed |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 2 Всего: 39 |
Я попробовал с этими версиями, у меня тоже таймаут не работает. Так что видимо баг, я зарепортил: https://github.com/csirtgadgets/LWPx-ParanoidAgent/issues/7
А работал у меня таймаут адекватно с такой комбинацией версий $Net::HTTP::VERSION = 6.03 $LWP::UserAgent::VERSION = 6.04 $LWPx::ParanoidAgent::VERSION = 1.07 Так что как вариант можно даунгрейднуться |
|||
|
||||
burakov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
дак.. как же найти эти старые версии модулей и как поставить?
посмотрел на cpan.org только последние... ссылок никаких на старые версии нет.. к тому же, даже с самым новым вариантом install MIKEM/Net-SSLeay-1.46.tar.gz корректно не становится. (лог приложил) Присоединённый файл ( Кол-во скачиваний: 2 ) ![]() |
|||
|
||||
alezzz |
|
|||
![]() сплю... ![]() ![]() Профиль Группа: Участник Сообщений: 499 Регистрация: 17.8.2009 Репутация: 2 Всего: 14 |
http://www.cpan.org/authors/id/G/GA/GAAS/ Net::HTTP от 6.00 до 6.06, остальные по такому же принципу
или такой вариант http://stackoverflow.com/questions/260593/...f-a-perl-module , но сам не пробовал Это сообщение отредактировал(а) alezzz - 27.12.2013, 10:36 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl: CGI программирование" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: разработка для Web | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |