| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: разработка для Web > lwp завершить соединение по таймауту |
| Автор: burakov 11.12.2013, 14:40 |
| Добрый день. необходимо прервать соединение 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 11.12.2013, 14:46 |
эээ... имеешь ввиду узкий канал?? |
| Автор: burakov 11.12.2013, 15:10 |
| совершенно верно. бывает канал сам по себе узкий. а бывает его преднамеренно сужают... но мне нужно просто оборвать в таком случае выполнение запроса и продолжить дальше. |
| Автор: Bulat 11.12.2013, 15:35 | ||
а ежели через fork попробовать? |
| Автор: burakov 11.12.2013, 15:53 |
| ну можно попробовать через fork, можно через wget на крайний случай. хотелось волшебное решение через LWP, чтобы двиг не переписывать. (тем более все должно и на винде работать, а форки в винде по моему еще хуже чем threads) |
| Автор: krypt3r 12.12.2013, 06:39 | ||
Может поможет
|
| Автор: vadiml 12.12.2013, 14:52 |
| Если у Вас коннект по https, то в LWP есть с timeout-ом баг http://stackoverflow.com/questions/9400068/make-timeout-work-for-lwpuseragent-https Т.е. надо писать timeout => 5, Timeout => 5 |
| Автор: Pfailed 12.12.2013, 15:47 |
Его же пофиксили давно, там даже написано. А что касается LWP, то вся соль здесь https://metacpan.org/source/GAAS/libwww-perl-6.05/lib/LWP/Protocol/http.pm#L128 Соответственно для реализациии dead line таймаута потребуется либо реализовать свой имплементор для http и https схемы, унаследовавшись от LWP::Protocol::http и LWP::Protoco::https сответственно и переопределив метод request. Либо переопределить LWP::Protocol::http::request напрямую monkey патчингом. |
| Автор: ginnie 12.12.2013, 19:55 |
| В http://stackoverflow.com/questions/73308/true-timeout-on-lwpuseragent-request-method посоветовали LWPx::ParanoidAgent, в нем реализован общий timeout(). |
| Автор: Pfailed 12.12.2013, 20:11 | ||
| ginnie, он там реализован как раз с помощью SIGALRM Я тут придумал как это можно сделать дёшево и сердито. Делаем tied handle, который при каждом read/write проверяет а не наступил ли таймаут (прошло больше времени, чем задано). Если прошло возвращает ошибку. Далее нужно связать с этим умным handl'ом сокет, который создаёт LWP. Это можно легко сделать подменив IO::Socket::INET::new на наш со связыванием (локализовав эту подмену внутри функции, где LWP создаёт сокет). Далее тестовый скрипт, показавший, что это более менее работает. При установленном таймауте 3 секунды проходит 4. А на простом LWP все 10 (собственно столько создаваемый сервер и отдаёт контент). На винде тоже работает.
Добавлено через 3 минуты и 41 секунду ginnie, прошу прощенья. Перепутал с LWP::UserAgent::Paranoid |
| Автор: Pfailed 12.12.2013, 20:32 |
| Да, на моём тесте LWPx::ParanoidAgent выдал ровно 3 отведённые ему секунды. Можно рекомендовать к использованию. |
| Автор: burakov 17.12.2013, 16:45 | ||
| посоветовали еще WGET --connect-timeout=СЕК установка тайм-аута подключения в СЕК. --read-timeout=СЕК установка тайм-аута чтения в СЕК. попробовал
но коннект не обрывает. а это вроде все таймауты, которые у него есть. просто по идее грабер должен кроссплатформенно виндоус, линукс работать.. а под виндоусом alarm не особо на многопотоке. как то можно оборвать по таймауту wget соединение? |
| Автор: Bulat 17.12.2013, 18:05 |
ну там еще и dns-timeout был(что-то вроде этого), хотя это наверно зависит еще и от самой оси, у меня на убунту по крайней мере что-то такое есть. В других не знаю. Но на тему wget тогда у меня вопрос - разве его винда поддерживает? |
| Автор: burakov 17.12.2013, 21:35 |
| ну есть сборка win32, а как же. но че то не работает обрыв (по крайней мере видно это не те таймауты) пришлось даже админа знакомого упросить смоделировать на линуксе ситуацию на моем ай пи. wget не обрывает, хотя было бы удобно его как клиента получающего контент использовать |
| Автор: Bulat 18.12.2013, 08:05 |
| burakov, что-то больно сложный велосипед у тебя получается. Чем тебе не нравится предложенный мною ранее способ - fork? Создаешь дочерние процессы и вешаешь тот же аларм на весь дочерний процесс, если висит слишком долго - помрет без каких-либо последствий для родительского процесса. Да и под винду такой фокус должен сработать. |
| Автор: burakov 18.12.2013, 14:22 |
| УРА!! LWPx::ParanoidAgent работает даже под виндой и в многопоточном режиме !! супер !!! то что мне нужно, чтобы особо не заморачиваться с сигналами. не понимаю почему такая нужная вещь не реализована сразу в LWP и бем более нет ее в WGET! огромное спасибо! p.s. сразу не заметил 2ю страницу ответов. *про fork * ну я ж не против нужно пробовать. на данный момент просто был собран движок многопоточно на threadth + lwp 2к строк коду. в которых я уже сам понять не могу что к чему. и нужно было быстрое решение (ибо сдавать уже вчера все это дело). подменил LWP на LWPx::ParanoidAgent и все заработало как нужно. это просто супер. ну форки. попробую конечно , но это уже будет другой двиг., другое решение и другое потраченное время. |
| Автор: burakov 19.12.2013, 14:16 |
| Люди! а вот под линукс он не лезет пробую perl -MCPAN -e shell install LWPx::ParanoidAgent не ставиться , потому что не может установиться пакет Net::SSL ставлю на дебиан 6,0 подскажите, что делать? как установить его? |
| Автор: Bulat 19.12.2013, 14:38 |
| Автор: burakov 19.12.2013, 15:22 |
| модули засадил вот так apt-get install libnet-ssleay-perl apt-get install libcrypt-ssleay-perl apt-get install liblwpx-paranoidagent-perl но ... хотя парсер заработал без ошибок сама функция таймауа не работает. под виндоусом главное все ок. а под линуксом нет. |
| Автор: Pfailed 19.12.2013, 18:31 |
| обнови через cpan до последней версии. И Debian заодно, 6 уже не актуальна |
| Автор: burakov 20.12.2013, 08:30 | ||
| >>обнови через cpan до последней версии. Net::SSL у меня не ставится через CPAN. make NO дальше ума не хватает. из за этого ничего не работает. в принципе я поставил то же самое, только в пакетах. дебиан 6,0 у меня на вдс . там другого не дают. вышел из положения при помощи wget. все таки комплекс его таймаутов обрывает по времени коннект.. это очень хорошо.
вот такая строка позволяет работать через wget но буду очень признателен, если поможете таки добить LWPx потому как на винде он работает отлично. огромное спасибо. и может быть кто подскажет..как от WGET поймать его STDOUT то есть то что он на экран показывает, мне бы поймать и разобрать (статус ответа сервера и прочее).. |
| Автор: krypt3r 23.12.2013, 11:29 | ||
Проблемы при установке Net::SSLeay (или какой там у вас) озвучьте. Наверняка не хватает пакетов. libssl-dev стоит? |
| Автор: burakov 23.12.2013, 12:41 |
| я модули поставил вот так (тоже люди посоветовали). прямо из дистриба дебиан. 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 23.12.2013, 13:16 |
| Что-то каша у вас какая-то: модуль можно ставить либо через apt-get, либо через CPAN. В CPAN-е лежат более свежие версии, собираемые из исходников. Если репозиторная версия вас не устраивает, удалите ее и поставьте CPAN-овскую. PS. Мой предыдущий пост был о проблемах установки модуля со CPAN. |
| Автор: burakov 24.12.2013, 13:10 |
| при установке perl -MCPAN -e shell не может корректно поставить зависимости Crypt-SSLeay-0.64.tar.gz (Net::SSL); |
| Автор: krypt3r 24.12.2013, 13:26 |
| Лучше бы полный лог. Все самое интересное — выше "Test Summary Report" |
| Автор: burakov 24.12.2013, 13:43 |
| ну вот. там теперь чего то стоит. чего то нет. пришлось вот так force install LWPx::ParanoidAgent > log1.txt сделать |
| Автор: krypt3r 24.12.2013, 14:10 |
| libcrypt-ssleay-perl стоит? Попробуйте удалить его. LWPx::ParanoidAgent требует Crypt::SSLeay версии 0.64. Возможно, конфликт. Также попробуйте ставить Net::SSL отдельно либо вообще вручную (wget, tar, perl Makefile.PL, make, make test, если все норм будет, тогда make install) |
| Автор: burakov 24.12.2013, 14:57 |
| libcrypt-ssleay-perl вот этого не было. на всякий случай сделал apt-get remove и попытался поставить install Crypt::SSLeay на нем выдает ошибки (пишет нет каких то библиотек) лог приложил |
| Автор: noize 24.12.2013, 15:34 |
| Попробуйте поставить libssl, libssl-dev и на всякий случай openssl: aptitude install libssl1.0.0 libssl-dev openssl |
| Автор: krypt3r 25.12.2013, 05:51 | ||
Ну вот видите, я же говорил проверить пакет libssl-dev |
| Автор: burakov 25.12.2013, 14:29 |
| в итоге было поставлено 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 это то, что надо. под виндой полностью удовлетворяет, а под линуксом ни черта не работает. спасибо. |
| Автор: Pfailed 26.12.2013, 15:37 |
| версию Net::HTTP, LWP::UserAgent, IO::Socket::SSL, LWPx::ParanoidAgent в студию |
| Автор: burakov 26.12.2013, 17:01 |
$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 логи прикладываю.. |
| Автор: noize 26.12.2013, 17:09 |
| install MIKEM/Net-SSLeay-1.46.tar.gz |
| Автор: Pfailed 26.12.2013, 19:02 |
| Я попробовал с этими версиями, у меня тоже таймаут не работает. Так что видимо баг, я зарепортил: https://github.com/csirtgadgets/LWPx-ParanoidAgent/issues/7 А работал у меня таймаут адекватно с такой комбинацией версий $Net::HTTP::VERSION = 6.03 $LWP::UserAgent::VERSION = 6.04 $LWPx::ParanoidAgent::VERSION = 1.07 Так что как вариант можно даунгрейднуться |
| Автор: burakov 27.12.2013, 09:58 |
| дак.. как же найти эти старые версии модулей и как поставить? посмотрел на cpan.org только последние... ссылок никаких на старые версии нет.. к тому же, даже с самым новым вариантом install MIKEM/Net-SSLeay-1.46.tar.gz корректно не становится. (лог приложил) |
| Автор: alezzz 27.12.2013, 10:34 |
| http://www.cpan.org/authors/id/G/GA/GAAS/ Net::HTTP от 6.00 до 6.06, остальные по такому же принципу или такой вариант http://stackoverflow.com/questions/260593/how-can-i-install-a-specific-version-of-a-perl-module , но сам не пробовал |