Moniwiki fake crtime

Moniwiki fake crtime
Submitted by hyacinth @
모니위키 하단에서는 보통 페이지 수정 시간을 찾을 수 있다. 나는 페이지 생성 시간도 보여주고 싶었다.

그 전에, 많은 *nix 환경(ext4 이전 파일 시스템을 사용하는)에서는 파일 생성 시간을 제공하지 않는다. (ctime이 생성시간(creation time)이 아니라는 걸 처음 알았을 때는 놀랐는데─웃기게도 ctime은 원래 creation time을 뜻했다[1]. 이건 언젠가 이야기하고 싶은 주제인데 다음으로 미룬다.)

이게 모니위키와 관련이 있는 이유는 모니위키는 페이지 관리를 DB가 아닌 파일 시스템을 사용하기 때문인데, 그래서 페이지 수정 시간은 filemtime() 으로 쉽게 구할 수 있지만(페이지 하단의 `Modified on 2:32 pm, February 20, 2014' 와 같은) 페이지 생성 시간은 쉽게 구할 수가 없다! 모니위키에서 페이지(파일) 수정 시간을 구하는 방법은 두 가지가 있는데 하나는 페이지 파일의 mtime을 직접 얻는 방법과 모니위키에서 관리하는 수정 이력(editlog)으로부터 fake mtime을 구하는 방법이다. (이는 config.php의 $use_fakemtime=1 또는 0 옵션으로 선택된다.) editlog 형식은 다음처럼 되어 있다.

FrontPage	59.15.101.153	1178892564	59.15.101.153	hyacinth		SAVE
FrontPage_2f2007_2d05	59.15.101.153	1178893017	59.15.101.153	hyacinth	Blog entry "테스트" added	SAVE
FrontPage_2f2007_2d05	59.15.101.153	1178893030	59.15.101.153	hyacinth		SAVE
FrontPage	59.15.101.153	1178893517	59.15.101.153	Anonymous		SAVE
...
...

공공 위키위키에서 페이지 생성시간은 그렇게 중요한 정보가 아니다. 하지만 개인 위키에선 Published date를 보여주고 싶을 수 있다. editlog 내용을 보고 이로부터 fake crtime을 구할 수 있겠다고 생각했다. editlog를 처음부터 읽어 그 페이지의 가장 처음 나온 기록이 바로 생성 시간일 것이다. 여기까지 생각이 들었을 때 바로 모니위키 엔진에 추가했다.

function crtime($pagename) {
    if (!$this->use_crtime)
      return;

    $pagename=$this->pageToKeyname($pagename);

    $fp_editlog = fopen($this->editlog_name, 'r');
    while(!feof($fp_editlog)) {
      $buffer=fgets($fp_editlog);
      if (strlen($buffer)>0 && preg_match("/^$pagename\t.[^\t]*\t(.[^\t]*)/",$buffer,$matches))
        return $matches[1];
    }
    fclose($fp_editlog);

    return;
  }

이제 페이지 아래 Published on 5:22 am, February 2, 2014. 를 표시할 수 있게 되었다. :)

» track back

이 글에는 0 개의 댓글이 있습니다.