Code: ->as_string; Зачем ещё заголовками голову морочать Достаточно и Code: ->content; так лучше: Code: @cont = $get->content =~ //g; print join "\n", @cont;
спс всем воспользовался этим накопились еще некоторые вопросы) вывод в консоль происходит только после выполнения скрипта можно ли заставить не буферизировать данные а сразу выводить?) типа аналога flush в пхп)
У меня такая проблема. Есть скрипт. Если он отрпавляет сообщение тому ID которого несушествует то произходит crash перла. Предпологаю что ето из-за того что скрипт неможет закончить свою задачу. Как с этим боротся?
А если проверку сделать ? если есть то отправил если нет то берет другой id... лучше конечно чтобы код выложил.
Code: use warnings; use LWP::UserAgent; use HTTP::Cookies; use threads; use threads::shared; my $threads = 1; my $username = ''; my $password = ''; my $msg = '...'; open BASE, '<base.txt' || die "$!\n"; chomp (my @base : shared = <BASE>); close BASE; my $ua = LWP::UserAgent->new; my $cookies = HTTP::Cookies->new; $ua->cookie_jar($cookies); $ua->post('http://toodoo.ru/account/login', { email => $username, password => $password})->as_string; for(0..$threads) {$trl[$_] = threads->create(\&send, $_);} for(@trl) { $_->join; } sub send { while (1) { my $id = shift @base; return if (!$id); $ua->post('http://toodoo.ru/inbox/compose', { user_id => $id, message_text => $msg})->as_string; print "$id\n"; sleep (1); } }
как правильно разделить работу скрипта на потоки если его работа связана с увеличением одного числа пример: PHP: $thr=5; for ($t=1;$t<4000;$t=$t+5){ for(0..$thr) { $trl[$_] = threads->create(\&func); } for(0..$thr) { $trl[$_]->join; }} func{ $t++; .... } в func работа с этим числом(а точнее дамп таблы через лимит mysql) или так? PHP: @arr=(1..4000); while(@arr){ for(0..$thr) { $trl[$_] = threads->create(\&func); } for(0..$thr) { $trl[$_]->join; }} } func { $t=shift(@arr); ... } оба способа работают но жутко тормозят. первый сжирает много памяти... или как оптимизировать хоть один? или есть более красивее варианты?
Попробуй типа PHP: use warnings; use threads; use threads::shared; my $tn = 5; my @trl = (); my $start : shared = 1; my $end = 4000; for(0..$tn-1) { $trl[$_] = threads->create(\&func, $_) } for(@trl) { $_->join } sub func { while($start < $end) { {lock($start); $start++;} print $start."\n"; } }
2Kaimi работает но даже с запросами, $start идет по порядку... хотя netstat показывает пять соединений у перла) и вроде не грузит ни проц ни память) и $end разве не нада расшаривать?
Не нужно, нужно расшаривать те переменные которые изменяются в процессе работы нитей, а в данном случае $end используется только для чтения.
взял за основу. по теории должна быть многопоточность но как уже говорил переменная выводится по порядку что видимо означает что все потоки выполняются последовательно. в тех примерах что я привел выше переменная выодится хаотично а не по порядку... и все таки как оптимизировать мой скрипт(жрет много памяти): PHP: use threads; use threads::shared; use LWP::UserAgent; |=1; $thr = 10; $ua = LWP::UserAgent->new(); $t=1; print "start...\n"; while($t<100){ for(0..$thr) { print "new thread...\n"; $trl[$_] = threads->create(\&func,$t++); } for(0..$thr) { $trl[$_]->join; } sub func{ $t=$_[0]; print "new zap...$t\n"; my $res = $ua->post( "http://mysite.com", {email => $email } )->as_string; $res=~m/1(.*)2/ig; print $t." ".$1."\n"; }
Как запустить ? ... создай файл(в папке со скриптом) 1.bat в нем cmd.exe напиши, потом нажми на него ) и напиши perl имя скрипта.pl
mr-leon, брут чего? И где ты его собираешься запускать? С локального или с сервера? Можно по подробнее, если хочешь расширенный ответ.
Логинюсь в vbulletin: Code: $url="форум"; $client = LWP::UserAgent->new( ) or die; $client->agent('Opera/9.0 (Windows NT 5.1; U; en; (R1 1.5))'); $cookie_jarr = HTTP::Cookies->new(); $client->cookie_jar( $cookie_jarr ); $answer = $client->post($url, Content => [ "vb_login_username" => "логин", "vb_login_password" => "пасс", "do" => "login", ],); Логин удачный идём дальше на страницу того что нужно сграбить: Code: $url="форум&page=1"; $client = LWP::UserAgent->new( ) or die; $client->agent('Opera/9.0 (Windows NT 5.1; U; en; (R1 1.5))'); $client->cookie_jar( $cookie_jarr ); $answer = $client->get($url); $answer->content =~ /рерулярка/g; потом иду на следующюю страницу, также, только естественно уже $url="форум&page=2" но, по регулярке не грабиться ничего, даже контент страницы не показывает. помогите разобраться т.е. дальше первой страницы ничего неграбится. sleep непомогает если беру страницы из .тхт то всегда ошибка: Code: Can't call method "scheme" on an undefined value at C:/Perl/lib/HTTP/Cookies.pm line 44, <PAGE> line 315.