|
|
ru.cgi.perl- RU.CGI.PERL ------------------------------------------------------------------ From : Artem Chuprina 2:5020/400 03 Jun 2002 17:35:54 To : "Edward Shevtsov" Subject : Re: счетчик глючит, а где не пойму -------------------------------------------------------------------------------- Здравствуй, Edward Shevtsov. ES> Здравствуйте, уважаемые ES> помогите разобраться, не врубаюсь в чем проблема. ES> Есть простейший текстовый счетчик ES> === Begin code === ES> $basedir = "....../cgi-bin/counter"; ES> read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); ES> $user = $ENV{'QUERY_STRING'}; ES> open (COUNT,"$basedir/$user"); ES> $countold = <COUNT>; ES> close COUNT; ES> $countnew = $countold + 1; ES> open (COUN,">$basedir/$user"); ES> print COUN "$countnew"; ES> close COUN; ES> print "Content-Type: text/html\n\n"; ES> print "$countnew\n"; ES> exit; ES> === End code === ES> Вставляю скрипт в страницу через SSI: ES> <!--#if expr="$DOCUMENT_NAME=index.shtml" --> ES> <DIV class="counter"><!--#include virtual="/cgi-bin/counter/counter.pl?rrr" ES> --></DIV> <!--#endif --> ES> Вроде работает, но через два раза на третий не отдает число на страницу (в ES> коде страницы пустой DIV). При этом в файле счетчик всегда увеличивается, ES> т.е. скрипт похоже работает правильно. Апач отдает страницу нормально, ES> разница только в размере файла - те 4 байта под цифры счетчика. Тестировал ES> дома - все работает, у хостинг-провайдера - вот такая беда. Куда ES> смотреть? Я бы сначала исправил все имеющиеся грубые ошибки, а потом бы уже смотрел, почему не работает. Исправленный счетчик для твоей (очень простой) ситуации выглядит примерно так: #!/usr/bin/perl use strict; use Fcntl qw(:flock :seek); my $user = $ENV{'QUERY_STRING'}; # ошибку отсутствия $user обрабатывай сам, я не знаю, как оно у тебя должно # рулиться my $basedir = "....../cgi-bin/counter"; open(COUNT,"+< $basedir/$user") or die "Cannot open $basedir/$user: $!"; flock(COUNT,LOCK_EX) or die "Cannot lock $basedir/$user: $!"; my $count = <COUNT>; $count++; seek(COUNT,0,SEEK_SET) or die "Cannot seek to start of $basedir/$user: $!"; print COUNT $count or die "Cannot write to $basedir/$user: $!"; close COUNT or die "Error closing $basedir/$user: $!"; print "Content-Type: text/html\n\n$count\n"; -- Artem Chuprina Communiware.net RFC2822: <ran@ran.pp.ru>, FIDO: 2:5020/358.49, ICQ: 13038757 --- ifmail v.2.15dev5 * Origin: Leninsky 45 home network (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.cgi.perl/144544875aa6d.html, оценка из 5, голосов 10
|