PERL CGIプログラム

私は、Webページに来る訪問者を追跡するための基本的な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,";
close(FILE);
$cnt=$cnt+1;
#opening file to write
open(FILE,">count.dat");
print FILE $cnt;
close(FILE);
print "Visitor count: $cnt";

問題は、Webページがリフレッシュごとに訪問者の数を増やさないことです。カウントは$ cntの初期値、つまり1にとどまります。問題がどこにあるのでしょうか?

1
使用しない場合はなぜ CGI を含むのですか?
追加された 著者 TLP,

5 答え

ファイルハンドルを開く試みがうまくいくかどうかは決してテストしません。私が読み書きできるパーミッションを持つファイルには、単一の数字だけが含まれていますが、コードは意図したとおりに動作しました。ファイルが存在しなかった場合、カウントは常に 1 になります。読み取り専用だった場合は、そのファイルが開始された場所に残ります。

より一般的なアドバイス:

  • use strict; and use warnings; (and correct code based on their complaints)
  • Use the three argument call to open as per the first example in the documentation
  • When you open a file always || handle_the_error_in($!);
  • Don't use a file to store data like this, you have potential race conditions.
  • Get the name of the language correct
7
追加された
または || より安全です
追加された 著者 Zaid,
@amal antony - スクリプトはスクリプトと同じ場所にそれを期待しています(ただし、 cgi-bin はこの種のデータを保持するのに非常に悪い場所です)
追加された 著者 Quentin,
@Quentinスクリプトは、現在の作業ディレクトリでスクリプトを期待しています。スクリプトは、スクリプトと同じディレクトリでも、そうでなくても構いません(!)。
追加された 著者 tadmc,
まあ、ありがとう。私はPerlのプログラマーではなく、これが私の最初のPerl CGIスクリプトです:D。 Btw、count.datファイルはどこにありますか?私はcgi-binでそれを見つけることができませんでした。私はUbuntu Linuxで働いています。
追加された 著者 Amal Antony,
私はそれを修正した。ファイルのアクセス許可に問題がありました。再度、感謝します!
追加された 著者 Amal Antony,

open()を1つだけ使用し、まだ存在しない場合はファイルを作成する別の解決法があります。ロッキングは、複数のアップデーターの間の潜在的な競合状態を排除します。

#!/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";
3
追加された
@マッテオ:同意し、追加されました。
追加された 著者 JRFerguson,
これは、問題や競合状態を解決しません。複数のプロセスが同時に書き込みと読み取りを行うことができます。
追加された 著者 Matteo,

いくつかの潜在的な理由:

  • 'count.dat'は open されていません。ファイルが開かれているかどうかを確認するには、少なくともまたはdie $ !; でテストしてください。

  • コードは実行されておらず、

1
追加された

あなたが忘れてしまった最も明白なことは、ファイル count.dat のパーミッションを変更することです。 これを行う :

sudo chmod 777 count.dat

それはトリックを行う必要があります

1
追加された

ウェブページを閉じてもう一度もう一度開く必要があります。ページを更新するだけでカウントは増加しません。

1
追加された