Программа PERL CGI - PullRequest
       5

Программа PERL CGI

1 голос
/ 24 ноября 2011

Я пробовал элементарный скрипт на 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. Есть идеи, в чем проблема?

Ответы [ 5 ]

7 голосов
/ 24 ноября 2011

Вы никогда не проверяете, работает ли попытка открыть дескриптор файла.Учитывая, что у меня было разрешение на чтение и запись в него, он содержал одно число и ничего больше, код вел себя как задумано.Если файл не существует, то счетчик всегда будет 1, если он только для чтения, то он останется там, где файл начинался.

Более общие рекомендации:

  • use strict; и use warnings; (и правильный код, основанный на их жалобах)
  • Используйте вызов с тремя аргументами для open согласно первому примеру в документации
  • Когда вы open файл всегда || handle_the_error_in($!);
  • Не используйте файл для хранения таких данных, у вас есть потенциальные условия гонки.
  • Получите имяязыка правильный
3 голосов
/ 24 ноября 2011

Вот альтернативное решение, которое использует только один 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";
1 голос
/ 28 ноября 2015

Самое очевидное, что вы бы забыли, это изменить права доступа к файлу count.dat Сделайте это:

sudo chmod 777 count.dat

Это должно сработать

1 голос
/ 24 ноября 2011

Несколько возможных причин:

  • 'count.dat' не open редактируется для чтения. Всегда проверяйте как минимум с or die $!;, чтобы проверить, открыт файл или нет

  • Код не выполняется, и вы думаете, что это

0 голосов
/ 24 ноября 2013

Вам нужно будет закрыть веб-страницу и открыть ее снова. Просто обновление страницы не увеличит счет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...