#!/usr/bin/perl use strict; use warnings; # 1) get actual referer path name (strip server part) my ($pagename, $client) = ($ENV{HTTP_REFERER}, $ENV{REMOTE_ADDR}); $pagename = $1 if $pagename =~ m{ ^\w+:// [^/]+ / (.+)$ }x; # 2) update db and get count value my $count = handledb($pagename, $client); # 3)write results ++$|; binmode STDOUT; print counterimage(48, 15, $count, 'blue', 'white'); # expect 6x13 font # Subroutine handledb() # update database stuff, return number hits of a site (link) # sub handledb { use DBI; my ($page, $client) = @_; my $dbhost = 'my.glory.host.com'; my ($dbn, $usr, $pw) =('counting', 'db-username', 'db-password'); my $ignoredreferer = '192.168.1.2'; my $dbh = DBI->connect("dbi:mysql:$dbn:$dbhost", $usr, $pw) || die "$DBI::errstr!"; my $item = $dbh->quote($page); my $query = 'INSERT IGNORE INTO counters (pagename) VALUES (?)'; my $sth = $dbh->prepare($query); $sth->execute( $item ); if( $client ne $ignoredreferer ) { # don't count on this referer $query = 'UPDATE counters SET pagecounter = pagecounter + 1 WHERE pagename = ?'; $sth = $dbh->prepare($query); $sth->execute( $item ); } $query = 'SELECT pagecounter FROM counters WHERE pagename = ?'; $sth = $dbh->prepare($query); $sth->execute( $item ); my ($nhits) = $dbh->selectrow_array($sth); $dbh->disconnect or warn "Disconnection failed: $DBI::errstr!\n"; return $nhits; } # Subroutine counterimage() # returns a buffer containing an (binary) image of the number # (in .png format) wanted plus it's corresponding http content header sub counterimage { use Imager; my ($lx, $ly, $text, $color, $bgcolor) = @_; my $img = Imager->new(xsize => $lx, ysize => $ly, channels => 3); my $fnt = Imager::Font->new(file =>'/usr/share/fonts/misc/6x13B.pcf.gz'); $img->box(filled=>1, color=>$bgcolor); $fnt->align(image => $img, x => $lx/2, y => $ly/2, string => $text, color => $color, halign => 'center', valign => 'center' ); my $data; $img->write(type=>'png', data=>\$data) or die $img->errstr; return "Content-type: image/png\n" . "Content-Length: " . length($data) . "\n\n" . $data; }