Perl CGI页面访问计数器不递增

n6lpvg4x  于 2023-03-19  发布在  Perl
关注(0)|答案(5)|浏览(123)

我尝试了一个基本的Perl/CGI脚本来跟踪访问网页的访问者。Perl代码如下所示:

#!/usr/bin/perl
#KEEPING COUNT OF VISITORS IN A FILE
use CGI':standard';
print "content-type:text/html\n\n";
#opening file in read mode
open (FILE,"<count.dat");
$cnt= <FILE>;
close(FILE);
$cnt=$cnt+1;
#opening file to write
open(FILE,">count.dat");
print FILE $cnt;
close(FILE);
print "Visitor count: $cnt";

问题是网页不会在每次刷新时增加访问者的数量。访问者的数量保持在$cnt的初始值,即'1''。你知道问题出在哪里吗?

9nvpjoqh

9nvpjoqh1#

你从来没有测试过打开文件句柄的尝试是否有效。假设一个我有读写权限的文件只包含一个数字,代码的行为和预期的一样。如果文件不存在,那么计数总是1,如果它是只读的,那么它将保持在文件开始的位置。
更一般的建议:

  • use strict;use warnings;(以及基于投诉的正确代码)
  • 按照the first example in the documentation使用open的三个参数调用
  • 当你open一个文件总是|| handle_the_error_in($!);
  • 不要像这样使用文件来存储数据,这样可能会出现争用情况。
  • 获取正确的语言名称
nfs0ujit

nfs0ujit2#

这里有一个替代的解决方案,它只使用一个open(),如果文件不存在就创建它。锁定消除了多个更新程序之间潜在的争用情况。

#!/usr/bin/env perl
use strict;
use warnings;
use Fcntl qw(:DEFAULT :flock);
my $file = 'mycount';
sysopen(my $fh, $file, O_RDWR|O_CREAT) or die "Can't open '$file' $!\n";
flock($fh, LOCK_EX) or die "Can't lock $file: $!\n";
my $cnt = <$fh>;
$cnt=0 unless $cnt;
$cnt++;
seek $fh, 0, 0;
print ${fh} $cnt;
close $fh or die "Can't close $file: $\n";
print "Visitor count: $cnt\n";
6g8kf2rb

6g8kf2rb3#

几个潜在原因:

  • 未对“count.dat”进行open艾德。始终至少使用or die $!;进行测试,以检查文件是否打开
  • 代码没有执行,而您认为它正在执行
ghg1uchk

ghg1uchk4#

最明显的事情,你会忘记是改变文件count.dat的权限这样做:

sudo chmod 777 count.dat

应该可以了

f8rj6qna

f8rj6qna5#

您需要关闭网页并重新打开。仅刷新页面不会增加计数。

相关问题