/ Forside / Teknologi / Udvikling / Perl / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Perl
#NavnPoint
bjarneA 141
poul_from 50
soccer 30
Nicknack 14
Tmpj 0
counter spørgsmål
Fra : Simon [2700]


Dato : 06-05-04 15:56

Hej,
jeg er ved at lave en counter til mit website, den gemmer i en mysql
database (det er vel bedre end en fil).
nå men jeg har lavet nedenstående kode, og ville bare lige høre om der var
nogen der havde ideér til opimering,
gerne i form af kodeforslag. tak

counteren skal som den står nu kaldes via
http://www.site.dk/count.pl?id=counter23

tabellerne laver jeg i et andet program selvfølgeligt, og det samme med
oversigten.

på forhånd tak for hjælpen.
mvh.Simon
ps. jeg vil gerne have den optimeret fordi det ikke er unormalt den skal
klare 400K hits i døgnet i trykperioder - og jeg er ikke eneste site på
serveren (vil den kræve for meget, og køre andre sites ned ?), jeg havde
tænkt mig bare at tilføje den til siderne som en <img src>

#!/usr/bin/perl
print "Content-type:text/html\n\n";
use CGI;
$query = new CGI();
$table = $query->param('id');
$table = "ref_".$table;
use DBI;
$|= 1;
$host = "";
$db="database";
$opt_user="login";
$opt_password="password";
$dbh = DBI->connect("DBI:mysql:$db:$host",$opt_user,$opt_password);
$dbh->do("update $table SET hits=hits+1;");
exit(0);



 
 
Kim Schulz (06-05-2004)
Kommentar
Fra : Kim Schulz


Dato : 06-05-04 16:43

On Thu, 6 May 2004 16:56:22 +0200
"Simon [2700]" <devnull@linux.org> wrote:
> Hej,
> jeg er ved at lave en counter til mit website, den gemmer i en mysql
> database (det er vel bedre end en fil).
> nå men jeg har lavet nedenstående kode, og ville bare lige høre om der
> var nogen der havde ideér til opimering,
> gerne i form af kodeforslag. tak
>
> counteren skal som den står nu kaldes via
> http://www.site.dk/count.pl?id=counter23
>
> tabellerne laver jeg i et andet program selvfølgeligt, og det samme
> med oversigten.
>
> på forhånd tak for hjælpen.
> mvh.Simon
> ps. jeg vil gerne have den optimeret fordi det ikke er unormalt den
> skal klare 400K hits i døgnet i trykperioder - og jeg er ikke eneste
> site på serveren (vil den kræve for meget, og køre andre sites ned ?),
> jeg havde tænkt mig bare at tilføje den til siderne som en <img src>
>
> #!/usr/bin/perl
> print "Content-type:text/html\n\n";

[snip]

Hvis du har tænkt dig at smide den med en "img src" så bør du nok
overveje at smide en billede relateret contetnt-type ud i stedet for
html.
Desuden bør du vel også sende en form for billede som output - evt. en
1x1pixel gennemsigtig sag, men bare et eller andet så siden ikke
indeholder fejl.


--
Kim Schulz | Stop Software patents before it is too late!
Geek by nature |
schulz.dk |

Tore Aursand (06-05-2004)
Kommentar
Fra : Tore Aursand


Dato : 06-05-04 16:46

On Thu, 06 May 2004 16:56:22 +0200, Simon [2700] wrote:
> jeg er ved at lave en counter til mit website [...]

Hvorfor? Tallet for antall besøkende blir uansett ikke riktig. Du burde
heller prøve et program som analyserer tilgangsloggen til web-serveren.

, [...] den gemmer i en mysql database (det er vel bedre end en fil).

Nja. Nei. Å bruke MySQL til dette er overkill så lenge det ikke er
snakk om tusenvis av besøkende i sekundet (og da ville uansett
web-serveren vært det store problemet).

> jeg vil gerne have den optimeret fordi det ikke er unormalt den skal
> klare 400K hits i døgnet i trykperioder [...]

Bruk mod_perl; CGI-scriptet ditt vil da ligge ferdig-kompilert i minnet.

> #!/usr/bin/perl
> print "Content-type:text/html\n\n";
> use CGI;
> $query = new CGI();
> $table = $query->param('id');
> $table = "ref_".$table;
> use DBI;
> $|= 1;
> $host = "";
> $db="database";
> $opt_user="login";
> $opt_password="password";
> $dbh = DBI->connect("DBI:mysql:$db:$host",$opt_user,$opt_password);
> $dbh->do("update $table SET hits=hits+1;"); exit(0);

Litt bedre, IMO:

#!/usr/bin/perl
#
use strict;
use warnings;
use CGI qw( -compile );

my $CGI = CGI->new();
print $CGI->header( -type => 'text/html' );

my $table = $CGI->param('id') || '';
if ( length $table ) {
$table = 'ref_' . $table;

our $dbh;
unless ( defined $dbh ) {
my $db_host = '';
my $db_name = 'database';
my $db_user = 'login';
my $db_pass = 'password';

$dbh = DBI->connect("DBI:mysql:database=$db_name;host=$db_host",
$db_user, $db_pass );

# Legg til feilhåndtering her i tilfelle det mislykkes å
# koble til databasen.
}

$dbh->prepare( "UPDATE $table SET hits = hits + 1" );
$dbh->execute();
$dbh->finish();
}

Dette vil gå mer enn kjapt nok om du benytter mod_perl. Trenger du
ytterligere hastighet, anbefaler jeg deg å tune web-serveren, for så å
cache prepare-setningen.


--
Tore Aursand <tore@aursand.no>
"Have you ever had a dream, Neo, that you were so sure was real? What
if you were unable to wake from that dream? How would you know the
difference between the dream world and the real world?" (Morpheus, The
Matrix)

Adam Sjøgren (06-05-2004)
Kommentar
Fra : Adam Sjøgren


Dato : 06-05-04 17:11

On Thu, 6 May 2004 16:56:22 +0200, Simon wrote:

> jeg er ved at lave en counter til mit website, den gemmer i en mysql
> database (det er vel bedre end en fil).

Hvad mon tager længst tid, at låse, skrive til, og lukke en fil eller
at lave en forbindelse til en database, sende en kommando dertil, og
lukke forbindelsen igen?

$ cat file_vs_mysql.pl
#!/usr/bin/perl

use warnings;
use strict;

use DBI;
use Fcntl qw(:flock);

use Benchmark qw(cmpthese);

cmpthese(
20000,
{
file =>\&file_count,
mysql=>\&mysql_count,
}
);

sub file_count {
open LH, 'lockfile' or die "$!";
flock(LH, LOCK_EX);

open FH, 'test.txt' or die "$!";
my $num=<FH>;
close FH;
open FH, '>test.txt' or die "$!";
print FH ++$num;
close FH;

close LH;
}

sub mysql_count {
my $dbh=DBI->connect('DBI:mysql:test2','xxxx','xxxxxxxxxxx') or die "$!";
$dbh->do('update test set hits=hits+1;');
$dbh->disconnect;
}
$ ./file_vs_mysql.pl
Benchmark: timing 20000 iterations of file, mysql...
file: 4 wallclock secs ( 1.15 usr + 2.31 sys = 3.46 CPU) @ 5780.35/s (n=20000)
mysql: 39 wallclock secs (16.89 usr + 2.63 sys = 19.52 CPU) @ 1024.59/s (n=20000)
Rate mysql file
mysql 1025/s -- -82%
file 5780/s 464% --
$

> ps. jeg vil gerne have den optimeret fordi det ikke er unormalt den
> skal klare 400K hits i døgnet i trykperioder - og jeg er ikke eneste
> site på serveren (vil den kræve for meget, og køre andre sites ned
> ?), jeg havde tænkt mig bare at tilføje den til siderne som en <img
> src>

Jeg vil tro det tungeste performancemæssigt i denne sammenhæng er at
starte dit CGI-script.


Mvh.

--
"Ours is wicked cool." Adam Sjøgren
asjo@koldfront.dk

Peter Makholm (06-05-2004)
Kommentar
Fra : Peter Makholm


Dato : 06-05-04 18:09

asjo@koldfront.dk (Adam Sjøgren) writes:

> sub file_count {
> open LH, 'lockfile' or die "$!";
> flock(LH, LOCK_EX);
>
> open FH, 'test.txt' or die "$!";
> my $num=<FH>;
> close FH;
> open FH, '>test.txt' or die "$!";
> print FH ++$num;
> close FH;
>
> close LH;
> }

Nu synes jeg at du er for venlig over for mysql. Er du klar over hvor
meget tid du spilder på at åbne og lukke filerne hele tiden?

sub file_count2 {
open FH, '+<', 'test.txt' or die "$!";
flock(FH,LOCK_EX);
my $num=<FH>;

seek FH, 0, SEEK_SET;
print FH ++$num;

close FH;
}

brother@localhost:/tmp$ perl counter.pl
Benchmark: timing 20000 iterations of file, file2...
file: 4 wallclock secs ( 1.68 usr + 2.31 sys = 3.99 CPU) @ 5012.53/s (n=20000)
file2: 2 wallclock secs ( 0.82 usr + 0.59 sys = 1.41 CPU) @ 14184.40/s (n=20000)
Rate file file2
file 5013/s -- -65%
file2 14184/s 183% --
brother@localhost:/tmp$

> Jeg vil tro det tungeste performancemæssigt i denne sammenhæng er at
> starte dit CGI-script.

Enig.

--
Peter Makholm | Perhaps that late-night surfing is not such a
peter@makholm.net | waste of time after all: it is just the web
http://hacking.dk | dreaming
| -- Tim Berners-Lee

Adam Sjøgren (06-05-2004)
Kommentar
Fra : Adam Sjøgren


Dato : 06-05-04 22:56

On 06 May 2004 19:08:42 +0200, Peter wrote:

> Nu synes jeg at du er for venlig over for mysql. Er du klar over
> hvor meget tid du spilder på at åbne og lukke filerne hele tiden?

> sub file_count2 { open FH, '+<', 'test.txt' or die "$!";

Hæhæ, jeg prøvede den vej, +<, først, men kunne ikke lige finde den
rigtige måde at seek'e på (tror jeg problemet var) - så jeg tog den
sikre, men langsommere metode.


,

--
"Ours is wicked cool." Adam Sjøgren
asjo@koldfront.dk

Søg
Reklame
Statistik
Spørgsmål : 177428
Tips : 31962
Nyheder : 719565
Indlæg : 6407936
Brugere : 218877

Månedens bedste
Årets bedste
Sidste års bedste