上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

たびたびdqfaq.comで利用してるFSWiki(FreeStyle Wiki)のカウンタがリセットされるので、標準(?)のカウンタプラグインを少し変更しました。

…というよりも、ほぼサンプルコードによるPerl入門さんの「順番を守ってファイルを読み書きする - flock関数」の流用です。
すいません、ありがとうございます。

diffをつけても良かったのですが、コードそのものが短いのでそのまま貼り付けます。
コメントにも書いていますが、たかがカウンタなので、途中でエラーに成っても死なず、空の値を返すようにしています。

ちなみに、カウンタプラグイン(Counter.pm)のディレクトリは、(WikiHOME)\plugin\info です。


############################################################
#
# <p>アクセス数を表示します。</p>
# <pre>
# {{counter カウンタ名}}
# </pre>
# <p>カウンタ名は省略できます。</p>
#
############################################################
package plugin::info::Counter;
use strict;
use Fcntl qw/:DEFAULT :flock :seek/;
#===========================================================
# コンストラクタ
#===========================================================
sub new {
my $class = shift;
my $self = {};
return bless $self,$class;
}

#===========================================================
# インライン関数
#===========================================================
sub inline {
my $self = shift;
my $wiki = shift;
my $name = shift;

my $count = 0;

if ($name eq '::') {
$name = $wiki->get_CGI->param('page');
}
if ($name eq '' or $name eq 'FrontPage') {
$name = 'default';
}

my $file = $wiki->config('log_dir')."/count-".Util::url_encode($name).".txt";

# 読み書きモードでオープン(あまり安全でない)
# O_CREATでファイルがなければ作成する。
# カウンタなので、失敗しても死なない。空の値を返す。以下同じ。
sysopen(my $fh, $file, O_RDWR | O_CREAT)
or return "";

# 排他ロック( 読み込んで書き込むので排他ロック )
flock($fh, LOCK_EX)
or return "";

my $cnt;
$cnt = <$fh>;
if (!defined $cnt && $!){ return ""; }

# ファイルポインタを先頭に移動
seek($fh, 0, SEEK_SET)
or return "";

# 書き込み。
print { $fh } $cnt
or return $cnt;

$cnt++;

# 書き込みサイズにファイルを切り詰める
truncate($fh, length $cnt);

# closeの際にファイルロックは解除される。
close $fh
or return $cnt;

return $cnt;
}

1;

Related Posts

Thoughts on スポンサーサイトFSWikiのカウンタリセット対策

Leave a Reply

* less than 16 characters
* less than 24 characters
* less than 16 characters
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。