[Perl] Новичкам: задаем вопросы

Discussion in 'PHP' started by _Great_, 26 May 2007.

Thread Status:
Not open for further replies.
  1. ph1l1ster

    ph1l1ster Elder - Старейшина

    Joined:
    11 Mar 2008
    Messages:
    396
    Likes Received:
    153
    Reputations:
    19
    Code:
    ->as_string;
    Зачем ещё заголовками голову морочать
    Достаточно и

    Code:
    ->content;
    так лучше:
    Code:
    @cont = $get->content =~ //g;
    print join "\n", @cont;
     
    1 person likes this.
  2. roddik

    roddik Member

    Joined:
    14 Jan 2009
    Messages:
    117
    Likes Received:
    13
    Reputations:
    0
    Code:
    use LWP::Simple qw[get];
    
    my $page = get('http://google.com');
     
  3. j0ker13

    j0ker13 Elder - Старейшина

    Joined:
    28 Jul 2008
    Messages:
    199
    Likes Received:
    16
    Reputations:
    5
    спс всем
    воспользовался этим
    накопились еще некоторые вопросы)
    вывод в консоль происходит только после выполнения скрипта
    можно ли заставить не буферизировать данные а сразу выводить?)
    типа аналога flush в пхп)
     
  4. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    811
    Reputations:
    231
    $|=1; в начале скрипта добавь
     
    _________________________
  5. KrafT

    KrafT Elder - Старейшина

    Joined:
    29 Nov 2004
    Messages:
    62
    Likes Received:
    2
    Reputations:
    0
    У меня такая проблема. Есть скрипт. Если он отрпавляет сообщение тому ID которого несушествует то произходит crash перла. Предпологаю что ето из-за того что скрипт неможет закончить свою задачу. Как с этим боротся?
     
  6. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    811
    Reputations:
    231
    Код покажи, иначе непонятно из-за чего такое происходит
     
    _________________________
  7. TheSoul

    TheSoul Elder - Старейшина

    Joined:
    12 Nov 2007
    Messages:
    83
    Likes Received:
    35
    Reputations:
    0
    А если проверку сделать ? если есть то отправил если нет то берет другой id... лучше конечно чтобы код выложил.
     
  8. KrafT

    KrafT Elder - Старейшина

    Joined:
    29 Nov 2004
    Messages:
    62
    Likes Received:
    2
    Reputations:
    0
    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);	
    	}
    }
    
     
  9. j0ker13

    j0ker13 Elder - Старейшина

    Joined:
    28 Jul 2008
    Messages:
    199
    Likes Received:
    16
    Reputations:
    5
    как правильно разделить работу скрипта на потоки если его работа связана с увеличением одного числа
    пример:
    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);
    ...
    }
    оба способа работают но жутко тормозят. первый сжирает много памяти... или как оптимизировать хоть один? или есть более красивее варианты?
     
  10. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    811
    Reputations:
    231
    Попробуй типа
    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";
        }
    }

     
    _________________________
  11. j0ker13

    j0ker13 Elder - Старейшина

    Joined:
    28 Jul 2008
    Messages:
    199
    Likes Received:
    16
    Reputations:
    5
    2Kaimi
    работает но даже с запросами, $start идет по порядку...
    хотя netstat показывает пять соединений у перла)
    и вроде не грузит ни проц ни память)
    и $end разве не нада расшаривать?
     
  12. razb

    razb Active Member

    Joined:
    24 Mar 2009
    Messages:
    658
    Likes Received:
    133
    Reputations:
    18
    Не нужно, нужно расшаривать те переменные которые изменяются в процессе работы нитей, а в данном случае $end используется только для чтения.
     
  13. j0ker13

    j0ker13 Elder - Старейшина

    Joined:
    28 Jul 2008
    Messages:
    199
    Likes Received:
    16
    Reputations:
    5
    спс ясно) а как всетаки сделать многопоточность?)
     
  14. razb

    razb Active Member

    Joined:
    24 Mar 2009
    Messages:
    658
    Likes Received:
    133
    Reputations:
    18
    Kaimi тебе привел пример, вот его и бери за основу.
     
  15. j0ker13

    j0ker13 Elder - Старейшина

    Joined:
    28 Jul 2008
    Messages:
    199
    Likes Received:
    16
    Reputations:
    5
    взял за основу. по теории должна быть многопоточность но как уже говорил переменная выводится по порядку что видимо означает что все потоки выполняются последовательно.
    в тех примерах что я привел выше переменная выодится хаотично а не по порядку...
    и все таки как оптимизировать мой скрипт(жрет много памяти):
    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";
    }
     
    #1055 j0ker13, 26 Apr 2009
    Last edited: 26 Apr 2009
  16. mr-leon

    mr-leon New Member

    Joined:
    24 Apr 2009
    Messages:
    7
    Likes Received:
    0
    Reputations:
    0
    привет всем допустим у меня есть брутт на пёрл как его пременить помогите кто сможет
     
  17. TheSoul

    TheSoul Elder - Старейшина

    Joined:
    12 Nov 2007
    Messages:
    83
    Likes Received:
    35
    Reputations:
    0
    Как запустить ? ... создай файл(в папке со скриптом) 1.bat в нем cmd.exe напиши, потом нажми на него ) и напиши perl имя скрипта.pl
     
  18. Gaus

    Gaus Member

    Joined:
    8 Feb 2009
    Messages:
    136
    Likes Received:
    36
    Reputations:
    3
    Ну для начала нужно скачaть ActivePerl
     
  19. demond

    demond Member

    Joined:
    5 Nov 2008
    Messages:
    101
    Likes Received:
    22
    Reputations:
    5
    mr-leon, брут чего? И где ты его собираешься запускать? С локального или с сервера? Можно по подробнее, если хочешь расширенный ответ.
     
  20. ph1l1ster

    ph1l1ster Elder - Старейшина

    Joined:
    11 Mar 2008
    Messages:
    396
    Likes Received:
    153
    Reputations:
    19
    Логинюсь в 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.
     
    #1060 ph1l1ster, 30 Apr 2009
    Last edited: 30 Apr 2009
Thread Status:
Not open for further replies.