środa, 26 października 2011

Perl - pierwsze starcie

Potrzebowalem dzis prztestowac skrypty ktore napisalem w php , test mial za zadania zbadac czy skrypt nie wykazuje bledow kiedy zostaje wywolywany bardzo czesto. Jako ze moglem zrobic to w sposob dowolny to wybralem taki ktorego nie znam, tzn wybralem sobie jezyk Perl i w nim napisalem skrypt ktory w watkach wywolywal moj skrypt i zrzucal mi na ekran wynik wywolania. Test to prawie zaden, bo wynik weryfikuje moj wzrok w starciu z ekranem, ale nie o tescie chce tu pisac , a o Perlu. Nic o nim nie wiedzialem i za duzo wciaz nie wiem, ale udalo mi sie wydziargac kawalek kodu i to co poznalem podoba mi sie.

Oto kod:


#!/usr/bin/perl -w
use LWP::UserAgent;
use HTTP::Request;
use HTTP::Response;
use URI::Heuristic;
use strict;
use warnings;
use Time::HiRes qw(usleep nanosleep);

my @childs;

#
# to run this test just type: perl scriptname.pl threads_number url
#

my $threadsCount = shift;
my $raw_url = shift or die "usage: $0 url\n";
#my $raw_url = "http://localhost/xxxx/xxxxx/xxxxxxx-Test.php";

for ( my $count = 1 ; $count <= $threadsCount ; $count++){
    my $pid = fork();
    if ( $pid){
        push(@childs, $pid);
    }
    elsif ( $pid == 0 ){
        testContent($raw_url, $count);
        exit 0;
    }   
    else{
        die "couldnt fork: $!\n";
    }
}

foreach ( @childs ){
    my $tmp = waitpid($_,0);
}


sub testContent
{
    my $rnd = int(rand(100));
    $rnd = $rnd * 100000;
    usleep($rnd);

    my $raw_url = shift;
    my $number = shift;
    my $url = URI::Heuristic::uf_urlstr($raw_url);
    $| = 1;

    my $ua = LWP::UserAgent->new();
    $ua->agent("");

    my $req = HTTP::Request->new(GET => $url);

    my $response = $ua->request($req);
    if ($response->is_error()) {
        printf "error:  %s\n", $response->status_line;
        }
    else {
        my $content = $response->content();
        print  $content;
    }
    return;
}
Z tego co widze to shiftem przechwytuje sie przekazane parametry:
my $threadsCount = shift;
my $raw_url = shift or die "usage: $0 url\n";

 Funkcja zwraca liczby tylko z zakresu 0,n , a moze ja o czyms nie wiem:
my $rnd = int(rand(100));

Jesli uzyje sie klasycznego rozwiazania z watkami to po ich odpaleniu aplikacja sie zamknie, i nie znalazlem sensownego rozwiazania tego problemu. Jesli natomiast uzyje sie forkow to mozna uzyc ponizszego kodo do odczekania az procesy sie zamkna:
foreach ( @childs ){
    my $tmp = waitpid($_,0);
}

Ponizej zrodla z ktorych korzystalem i kilka pytan-odpowiedzi ktore sie pojawily podczas dzisiejszego dnia.

Instalacja perla
sudo apt-get install perl


Howto find out perl version
$ perl -v

Tutorials:
http://perldoc.perl.org/5.12.4/index-tutorials.html
http://pl.wikibooks.org/wiki/Perl

Calling the Debugger
perl -d program_name

Brak komentarzy:

Prześlij komentarz