| 
					
							
        
    
        
						
			 | 
			
			
					    
					
        
         
          
         
	
            | 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
            
              |   |   
            
        
 
    
 
					
					 
			 | 
			
				
        
			 |