#action Blog 블로그 더하기 ##Blog {{{#!blog hyacinth 2014-02-20T05:32:23 Moniwiki fake crtime 모니위키 하단에서는 보통 페이지 수정 시간을 찾을 수 있다. 나는 페이지 생성 시간도 보여주고 싶었다. 그 전에, 많은 *nix 환경(ext4 이전 파일 시스템을 사용하는)에서는 파일 생성 시간을 제공하지 않는다. (ctime이 생성시간(creation time)이 아니라는 걸 처음 알았을 때는 놀랐는데─웃기게도 ctime은 원래 creation time을 뜻했다[[footnote(http://en.wikipedia.org/wiki/Stat_(system_call)#ctime)]]. 이건 언젠가 이야기하고 싶은 주제인데 다음으로 미룬다.) 이게 모니위키와 관련이 있는 이유는 모니위키는 페이지 관리를 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를 처음부터 읽어 그 페이지의 가장 처음 나온 기록이 바로 생성 시간일 것이다. 여기까지 생각이 들었을 때 바로 모니위키 엔진에 추가했다. {{{#!php 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. 를 표시할 수 있게 되었다. :) }}} [[HTML(