1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| package Counter;
use strict; use warnings;
use CGI qw/:standard/;
use Fcntl qw/:flock/;
use base 'Exporter';
our @EXPORT = qw(my_counter);
my $prefix_counters = '/var/counters/';
sub my_counter {
my $name = shift || "global";
my $count = update_count($name, update_log($name));
return $count;
}
sub update_log {
my $name = shift;
my ($path, $is_uniq, $remote_ip) =
("$prefix_counters$name.log", 1, remote_host());
open my($log), '+<', $path
or die "Couldn't open $path : $!\n";
flock $log, LOCK_EX;
while( <$log> ) {
chomp;
if( $_ eq $remote_ip ) {
$is_uniq = 0;
last;
}
}
print {$log} $remote_ip, "\n" if $is_uniq;
flock $log, LOCK_UN;
return $is_uniq;
}
sub update_count {
my ($name, $is_uniq) = @_;
my $path = "$prefix_counters$name.count";
open my($counter), '+<', $path
or die "Couldn't open $path : $!\n";
flock $counter, LOCK_EX;
my $count = do { local $/; <$counter> };
$count ||= 0;
if( $is_uniq ) {
seek $counter, 0, 0;
truncate $counter, 0;
print {$counter} $count + 1;
}
flock $counter, LOCK_UN;
return $count;
}
1; |
Partager