cache_path)) { FileHandler::makeDir($this->cache_path); } } /** * @brief optimize 대상 파일을 받아서 처리 후 optimize 된 파일이름을 return **/ function getOptimizedFiles($source_files, $type = "js") { // 관리자 설정시 설정이 되어 있지 않으면 패스 $db_info = Context::getDBInfo(); if($db_info->use_optimizer == 'N') return $source_files; // 캐시 디렉토리가 없으면 실행하지 않음 if(!is_dir($this->cache_path)) return $source_files; if(!count($source_files)) return; foreach($source_files as $file) { if(!$file) continue; $file = str_replace("\\","/",$file); if(eregi("^http:\/\/",$file) || $file == './common/css/button.css') $files[] = $file; else $targets[] = $file; } if(!count($targets)) return $files; $hashed_filename = $this->getHashFilename($targets); $filename = sprintf("%s%s.%s.php", $this->cache_path, $hashed_filename, $type); $this->doOptimizedFile($filename, $targets, $type); $files[] = $filename; return $files; } /** * @brief optimize는 대상 파일을 \n로 연결후 md5 hashing하여 파일이름의 중복을 피함 **/ function getHashFilename($files) { $buff = implode("\n", $files); return md5($buff); } /** * @brief 이미 저장된 캐시 파일과의 시간등을 검사하여 새로 캐싱해야 할지를 체크 **/ function doOptimizedFile($filename, $targets, $type) { if(!file_exists($filename)) return $this->makeOptimizedFile($filename, $targets, $type); $mtime = filemtime($filename); foreach($targets as $file) { if($mtime < filemtime($file)) return $this->makeOptimizedFile($filename, $targets, $type); } } /** * @brief css나 js파일을 묶어서 하나의 파일로 만들고 gzip 압축이나 헤더등을 통제하기 위해서 php파일을 별도로 만들어서 진행함 **/ function makeOptimizedFile($filename, $targets, $type) { /** * 실제 css나 js의 내용을 합친 것을 구함 **/ // 대상 파일의 내용을 구해오고 css 파일일 경우 url()내의 경로를 변경 foreach($targets as $file) { $str = FileHandler::readFile($file); $str = Context::convertEncodingStr($str); // css 일경우 background:url() 변경 if($type == "css") $str = $this->replaceCssPath($file, $str); $content_buff .= $str."\r\n"; } if($type!="css" && Context::isGzEnabled()) $content_buff = ob_gzhandler($content_buff, 5); $content_file = eregi_replace("\.php$","",$filename); $content_filename = str_replace($this->cache_path, '', $content_file); FileHandler::writeFile($content_file, $content_buff); /** * 압축을 지원하고 캐시 타임을 제대로 이용하기 위한 헤더 파일 구함 **/ // php의 헤더파일 생성 // gzip 압축 체크 if($type!="css" && Context::isGzEnabled()) $gzip_header = 'header("Content-Encoding: gzip");'; // 확장자별 content-type 체크 if($type == 'css') $content_type = 'text/css'; elseif($type == 'js') $content_type = 'text/javascript'; $header_buff = << EndOfBuff; FileHandler::writeFile($filename, $header_buff); } /** * @brief css의 경우 import/ background 등의 속성에서 사용되는 url내의 경로를 변경시켜줌 **/ function replaceCssPath($file, $str) { $this->tmp_css_path = Context::getRequestUri().ereg_replace("^\.\/","",dirname($file))."/"; $str = preg_replace_callback('!url\(("|\')?([^\)]+)("|\')?\)!is', array($this, '_replaceCssPath'), $str); $str = preg_replace('!\/([^\/]*)\/\.\.\/!is','/', $str); return $str; } function _replaceCssPath($matches) { if(eregi("^(http|\/|\.\/common\/)",$matches[2])) return $matches[0]; return sprintf('url(%s%s)', $matches[1], $this->tmp_css_path.$matches[2]); } } ?>