[첫화면으로]UseModWiki소스수정/페이지카운터

마지막으로 [b]

변경사항 (가장 최근의 "일반적인 수정"부터) (소소한 수정)

-14,15 +14,16
* 부작용 : 
** 각 페이지의 카운터를 "페이지이름.cnt" 라는 화일을 만들어 기록한다. 매번 페이지를 볼 때마다 해당 화일을 열고 쓰고 닫아야 한다. 이 홈에서 테스트할 때는 milisecond 단위로도 거의 차이가 없는 것으로 봐서 화일 입출력 시간 자체는 문제가 아닌데, 일관성 유지를 위해서 기록하는 순간에 lock 을 걸기 때문에 동시 방문자 수가 매우 많은 사이트의 경우 대문이나 최근변경내역 같은 페이지를 볼 때는 lock 을 경쟁하느라 문제가 생길 수 있다. 이 소스에서는 lock 을 얻는 데 실패할 경우, "단 한 번 재시도. 재시도 하기 전에 1초 대기. 재시도가 실패하면 조회수 갱신을 포기"하도록 인자를 주었기 때문에 별 탈이 없을 거라 희망하지만... 모르는 일이다.
** 가끔 어느 페이지의 카운트가 0으로 리셋되어 버리는 경우가 발생한다. 즉 그다지 신뢰성이 없는 카운터 -_-;;;
* 소스 수정
: config.pl 에 카운터 화일들이 저장될 디렉토리를 지정한다.
{{{perl
{{{#!vim perl
$CountDir    = "$DataDir/count";  # by gypark. Stores view-counts
}}}
: wiki.pl
{{{perl
{{{#!vim perl
...
###############
### added by gypark

-46,7 +47,7
}}}
:
{{{perl
{{{#!vim perl
sub BrowsePage {
    my ($id) = @_;
    my ($fullHtml, $oldId, $allDiff, $showDiff, $openKept);

-68,7 +69,7
}}}
:
{{{perl
{{{#!vim perl
sub GetEditGuide {
    ...
    if ($UseDiff) {

-89,7 +90,7
}}}
:
{{{perl
{{{#!vim perl
sub DeletePage {
    ...
### cache 화일도 같이 삭제

-103,7 +104,7
}}}
:
{{{perl
{{{#!vim perl
sub RenamePage {
    ...
### cache 화일은 삭제

-122,7 +123,7
}}}
:
{{{perl
{{{#!vim perl
### 아래 두 함수를 추가
sub GetCountFile {
    my ($id) = @_;

-173,7 +174,7
}}}
: action=maintain 을 하면, 현재 조회수 화일이 만들어지지 않은 페이지들에 대해 조회수를 "0"으로 세팅해준다.
{{{perl
{{{#!vim perl
sub DoMaintain {
    ...
    foreach $name (&AllPagesList()) {

-202,7 +203,7
번역 화일에서 "15 hits" 를 "조회수 : 15" 같이 순서를 바꾸는 것을 위해서... T('hits') 를 Ts('%s hits', $ViewCount) 로 바꿨습니다. <mysign([[Raymundo]],2003-3-7 11:23 pm)>
조회수가 0 또는 1일 때는 hits 대신 hit 라고 나오게 다시 고쳤습니다.
{{{perl
{{{#!vim perl
    $result .= Ts('%s hit' . (($ViewCount > 1)?'s':'') , $ViewCount)." | " if ($ViewCount ne "");
}}}
<mysign([[Raymundo]],2003-3-8 9:27 am)>


페이지 별로 조회수 출력

config.pl 에 카운터 화일들이 저장될 디렉토리를 지정한다.
$CountDir    = "$DataDir/count";  # by gypark. Stores view-counts

wiki.pl
...
###############
### added by gypark
### 패치를 위해 추가된 환경설정 변수
use vars qw(
    $UserGotoBar $UserGotoBar2 $UserGotoBar3 $UserGotoBar4
    ...
    $LogoPage $CheckTime $LinkDir $IconDir $CountDir        # $CountDir 추가
    );
###
###############
...
###############
### added by gypark
### 패치를 위해 추가된 내부 전역 변수
use vars qw(%RevisionTs $FS_lt $FS_gt $StartTime $Sec_Revision $Sec_Ts
    $ViewCount);                            # ViewCount 변수 추가
###
###############
...

sub BrowsePage {
    my ($id) = @_;
    my ($fullHtml, $oldId, $allDiff, $showDiff, $openKept);
    my ($revision, $goodRevision, $diffRevision, $newText);

    &OpenPage($id);
    &OpenDefaultText();
###############
### added by gypark
### page count
    if (-f &GetPageFile($id)) {
        $ViewCount = &GetPageCount($id) if (-f &GetPageFile($id));
    }
###
###############
    $openKept = 0;
    ...
}

sub GetEditGuide {
    ...
    if ($UseDiff) {
        $result .= ' ' . &ScriptLinkDiff(4, $id, T('(diff)'), $rev);
    }

    $result .= '<br>';
###############
### added by gypark
### page count
    $result .= Ts('%s hit' . (($ViewCount > 1)?'s':'') , $ViewCount)." | " if ($ViewCount ne "");
###
###############
    $result .= &GetHistoryLink($id, T('History'));
    if ($rev ne '') {
    ...
}

sub DeletePage {
    ...
### cache 화일도 같이 삭제
    &UnlinkHtmlCache($page);
### page count 화일도 같이 삭제  (추가할 단락)
    $fname = &GetCountFile($page);
    unlink ($fname) if (-f $fname);
###
    ...
}

sub RenamePage {
    ...
### cache 화일은 삭제
    &UnlinkHtmlCache($old);
### page count 화일도 변경  (추가할 단락)
    my ($oldcnt, $newcnt);
    $oldcnt = &GetCountFile($old);
    if (-f $oldcnt) {
        $newcnt = &GetCountFile($new);
        &CreatePageDir($CountDir, $new);  # It might not exist yet
        rename($oldcnt, $newcnt) || die "error while renaming count file";
    }
###
    ...
}

### 아래 두 함수를 추가
sub GetCountFile {
    my ($id) = @_;

    return $CountDir . "/" . &GetPageDirectory($id) . "/$id.cnt";
}

sub GetPageCount {
    my ($id) = @_;
    my ($pagecount, $countfile, $status);
    my ($edit_user, $edit_ip, $view_user, $view_ip, $add)
        = ($Section{'username'}, $Section{'ip'},
            &GetParam('username', ""), $ENV{REMOTE_ADDR}, 0);

    # 카운트 읽어옴
    &CreatePageDir($CountDir, $id);
    $countfile = &GetCountFile($id);
    ($status, $pagecount) = &ReadFile($countfile);
    $pagecount = 0 if ($status == 0);

    # 카운트 갱신 여부 결정
    if ($view_user eq "") {
        if ($edit_ip ne $view_ip) {
            $add = 1;
        }
    } elsif ($edit_user ne $view_user) {
        $add = 1;
    }
    if (&GetParam('InFrame',"") ne "") {
        $add = 0;
    }
    $pagecount += $add;

    # 카운트 기록
    if ($add == 1) {
        &RequestLockDir('count', 1, 1, 0) || return $pagecount;
        &WriteStringToFile($countfile, $pagecount);
        &ReleaseLockDir('count');
    }
    return $pagecount;
}
### 통채로 추가한 함수들의 끝
###############

&DoWikiRequest()  if ($RunCGI && ($_ ne 'nocgi'));   # Do everything.
1; # In case we are loaded from elsewhere
# == End of UseModWiki script. ===========================================

action=maintain 을 하면, 현재 조회수 화일이 만들어지지 않은 페이지들에 대해 조회수를 "0"으로 세팅해준다.
sub DoMaintain {
    ...
    foreach $name (&AllPagesList()) {
        &OpenPage($name);
        &OpenDefaultText();
        &ExpireKeepFile();
###############
### added by gypark
### 링크 목록을 별도로 관리
        &SaveLinkFile($name);
### page count                         (추가할 단락)
        if (!(-f &GetCountFile($name))) {
            &CreatePageDir($CountDir, $name);  # It might not exist yet
            &WriteStringToFile(&GetCountFile($name), "0");
        }
###
###############
        print ".... "  if ($name =~ m|/|);
        print &GetPageLink($name), "<br>\n";
    }
    ...
}

Notes

번역 화일에서 "15 hits" 를 "조회수 : 15" 같이 순서를 바꾸는 것을 위해서... T('hits') 를 Ts('%s hits', $ViewCount) 로 바꿨습니다.
-- Raymundo 2003-3-7 11:23 pm

조회수가 0 또는 1일 때는 hits 대신 hit 라고 나오게 다시 고쳤습니다.
    $result .= Ts('%s hit' . (($ViewCount > 1)?'s':'') , $ViewCount)." | " if ($ViewCount ne "");
-- Raymundo 2003-3-8 9:27 am


위키위키분류

마지막 편집일: 2007-1-8 12:19 pm (변경사항 [d])
1024 hits | Permalink | 변경내역 보기 [h] | 페이지 소스 보기