#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으로 쉽게 구할 수 있지만(페이지 Footer 부분의 `Modified on 2:32 pm, February 20, 2014' 와 같은) 파일 생성 시간은 쉽게 구할 수가 없다! 모니위키에서 페이지(파일) 수정 시간을 구하는 방법은 두 가지가 있는데 하나는 페이지 파일의 mtime을 직접 얻는 방법과 모니위키에서 관리하는 수정 이력(editlog)으로부터 fake mtime을 구하는 방법이다. 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을 구할 수 있다고 생각했다. {{{#!php function crtime() { if (!$this->use_crtime) return; $pagename=$_SERVER["PATH_INFO"]; $pagename=substr($pagename, 1, strlen($pagename)); $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[2]; } fclose($fp_editlog); return; } \}}} }}} [[HTML(