☆おまけ
書くほどのことはないと思っていましたが。。。。
前のカウンタの件に関してσ(^ー^)の見解を挙げておきます。
ファイルの内容が飛ばないかというのは飛ぶこともあります。
flockを使っても飛ぶと言っている方も居ますが。
'>>'なら一応flockなしでも飛ばないと考えて良いのだと思います。
ただし飛ぶというのはロックとは関係ないところで起こる可能性の方が高いと考えます。
一番の問題はファイルが大きくなったとき。
以前のプロバイダではかなりひどかった方に入ると思いますがプロセスがkillされると飛ぶ可
能性が高いです。
ファイルがでかくなるとサーバに負担をかけるので。
そんなことを考えているから何時まで経っても掲示板の改修が終わらない。。。。
KLAUS さんの改行を足していくというのは面白いですね。
これで flock なしで本当に壊れることはないのでしょうか。。
それはともかく、2つずつ増える理由はぴゅあさんの言われるとおりですね。
Windowsのデフォルトの出力モードはテキストモードなので "\n" --> "\r\n" という変換が行われます。
対策は(もしテレウェイでも変更なしに使えるようにするのであれば)、
open(OUT,">> $count_file") || die "error\n";
の後に、
binmode(OUT);
を入れるのがいいでしょう。これで OUT への出力は本当に "\n" だけになります。
binmode は UNIX上では何もしないので、この一行を入れてもテレウェイのサーバ上でそのまま使えます。
もっとも
print OUT "A";
とか普通の文字を print するのでもいいと思いますが。
>KLAUSさん
正しい動作です。
UNIXでは改行コードが$0Aの1バイト、Winでは改行コードが$0D,$0Aの2バイトだからです。
KLAUSといいます.ローカルでHttpdを使わせて頂いてます.
早速質問なのですが、
以下のカウンタPerlをHttpdで実行すると、カウンタが2ずつ増えてしまいます.
私はテレウェイ(NEWEBの前進)にHPを持ってますが、
そちらではちゃんと1ずつ増えました.
これはどうしてなのでしょうか?
▼▼いか問題のカウンタ
#!/usr/sbin/perl▲▲ここまで
# ↑このパスはあなたの環境に合わせて設定すること
# HTMLのファイル名を指定する
#<!-- ????? ./main.html -->
$html = "./main.html";
# カウンタの初期値を指定する
# カウンタファイルのサイズが大きくなった時の対策
$ini_count = 3500;
# アクセスカウント数を入れるファイルを指定する
# 最初はあらかじめ「0」を必ず入れておくこと
# HTMLにはカウンタ表示する場所に以下の文字列を書いておくこと
#
# このページには<!--count-->のアクセスがありました。
$count_file = "index.count";
# HTMLを読み込んで配列に代入
open(IN,"$html") || die "error\n";
@lines = <IN>;
close(IN);
# 今までのカウンタ数を読み込んで変数に代入
# open(DATA,"$count_file") || die "error\n";
# while(<DATA>){ $count = $_; }
# close(DATA);
$count =-s "$count_file";
$count = $count + $ini_count;
# 更新時間取得
($mtime) = (stat($html))[9];
($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime($mtime);
$mon++;
@week = ("日","月","火","水","木","金","土");
$wday = $week[$wday];
$year = sprintf("%.2d",$year);
$mon = sprintf("%.2d",$mon);
$mday = sprintf("%.2d",$mday);
$hour = sprintf("%.2d",$hour);
$min = sprintf("%.2d",$min);
$sec = sprintf("%.2d",$sec);
$MyStr="’$year.$mon/$mday ($wday) $hour:$min";
# WWWに出力
print "Content-type: text/html\n\n";
foreach $line (@lines) {
$line =~ s/<!--count-->/$count/g; # アクセスカウント数を入れ込む
$line =~ s/<!--LastMod-->/$MyStr/g; # 更新時間を入れ込む
print "$line";
}
# アクセスカウント処理
# $count++;
open(OUT,">> $count_file") || die "error\n";
print OUT "\n";
close(OUT);