#action Blog 블로그 더하기 ##Blog {{{#!blog hyacinth 2014-02-20T05:32:23 Moniwiki fake crtime 알려져 있다시피 대부분의 *NIX 환경(EXT4 이전 파일 시스템을 사용하는)에서는 파일 생성 시간이 지원되지 않는다. (그리고 많은 사람들이 이를 알고 놀란다. 그리고 여기서 놀란 사람은 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 FrontPage 59.15.101.153 1178893526 59.15.101.153 Anonymous SAVE FrontPage 59.15.101.153 1178893539 59.15.101.153 Anonymous SAVE FrontPage 59.15.101.153 1178893556 59.15.101.153 Anonymous SAVE UserPreferences_2f2007_2d05 59.15.101.153 1178894637 59.15.101.153 hyacinth Blog entry "테스트" added 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(