최신글 함수에 Cache 기능을 넣어보자! > 그누4 팁자료실

그누4 팁자료실

그누보드4와 관련된 팁을 여러분들과 함께 공유하세요.
나누면 즐거움이 커집니다.

최신글 함수에 Cache 기능을 넣어보자! 정보

최신글 함수에 Cache 기능을 넣어보자!

첨부파일

latest.lib.php (2.7K) 56회 다운로드 2007-05-08 20:00:57

본문

안녕하세요! www.teambh.net 을 운영하는 Airif 라고 합니다.
그동안 쭉 도움만 받다가 처음을 글을 올려 봅니다. 모두 잘 부탁드리겠습니다. :)
이 팁은 아주 간단한 방법으로 최신글 출력을 캐싱해서 파일로 저장해 놓는 방법입니다.
보통 메인페이지에 최신글을 많이 쓸경우 DB 접근할때의 부하를 무시할 수 없겠죠. 캐싱을 통해 DB가 아닌 파일로부터 직접 최신글을 받아 좀더 빠른 페이지접근을 할 수 있습니다.

TEAMBH.net 기준 적용 결과

  • 최신글 캐싱 적용 전 메인 페이지 로딩속도 : 0.51034808158875 초
  • 최신글 캐싱 적용 후 메인 페이지 로딩속도 : 0.024719953536987 초
  • 약 20배 정도 빨라졌습니다 :)
메인페이지 로딩이 최신글 때문에 느리신 분들은 한번 적용해 보시기 바랍니다.
경우에 따라선 비효율적 일수도 있습니다. (예: 글이 매우 자주 포스팅되는 게시판, 스킨에서 직접 DB 로부터 실시간데이터를 가져올 경우.)
팁란에 올리기도 뭐한 단순한 코드지만 용기를 내어 올려봅니다 좋은 의견 부탁드리겠습니다.

동작원리

  1. latest 함수에서 처음 해당 보드의 캐시파일을 찾습니다. 없으면 새로 캐시파일을 만듭니다.
  2. 캐시파일이 있으면 DB에 접근 하지 않고 캐시파일을 대신 뿌려줍니다.
  3. 하지만 업데이트 시간이 되면, 캐시파일이 있더라도, 무조건 새로 캐싱합니다. ($update_time 을 수정해  업데이트 시간을 조절할 수 있습니다.)
  4. 글이나 코멘트가 추가/삭제/수정 되면, 캐시파일을 삭제합니다.

참고

  • 캐시파일이 저장되는 곳은 data/cache_latest 입니다.
  • 캐시파일 전체 삭제는 rmdir( "$g4[path]/data/cache_latest" );  처럼 하시면 되겠습니다.

변경해야될 파일

  • lib/latest.lib.php
  • bbs/delete.php
  • bbs/delete_all.php
  • bbs/delete_comment.php
  • bbs/write_comment_update.php
  • bbs/write_update.php

변경 사항

  • lib/latest.lib.php
    1. latest 함수의 global $g4; 아랫줄에 다음을 추가 -->            if( $content = open_cache($bo_table) ) return $content;
    2. latest 함수의 ob_end_clean(); 다음에 다음을 추가 -->        write_cache($tmp_write_table,$content);
    3. latest 함수가 끝나는 곳 } 다음에 다음 함수 을 추가 -->

function write_cache($board_table,$content)
{
        global
$g4

        if( !
is_dir("$g4[path]/cache_latest") ) { 
                @
mkdir("$g4[path]/data/cache_latest", 0707); 
                @
chmod("$g4[path]/data/cache_latest", 0707); 
        } 

       
$fp = fopen( "$g4[path]/data/cache_latest/cache_$board_table.tmp", 'w'); 
       
fputs($fp, $content); 
       
fclose($fp);
}

function
open_cache($bo_table)

        global
$g4

       
$tmp_write_table = $g4['write_prefix'] . $bo_table; // 게시판 테이블 전체이름 

        // 캐쉬파일이 없으면 무조건 리턴 false 
        if( !is_file("$g4[path]/data/cache_latest/cache_$tmp_write_table.tmp") ) return false

       
// 초단위, 캐쉬 생성이후 지정된 시간이 지나면 무조건 캐쉬 업데이트; 1시간 = 3600초 
        $update_time = 3600

       
// 현재시간 
        $time = time(); 

       
// 파일시간 
        $ftime = filemtime("$g4[path]/data/cache_latest/cache_$tmp_write_table.tmp"); 

       
// 캐쉬파일 생성 이후 흐른시간 
        $dTime = $time - $ftime

       
// 업데이트 시간이 만료되면 리턴 false 
        if( $dTime >= $update_time ) return false

       
// 다음업데이트 시간 
        $nextUpdate = date("[Y/m/d H:i:s]",($ftime + $update_time)); 
       
// 캐쉬 파일 생성 시간 
        $ftime = date("[Y/m/d H:i:s]",$ftime); 

       
ob_start(); 
               
readfile( "$g4[path]/data/cache_latest/cache_$tmp_write_table.tmp" ); 
               
$content = ob_get_contents(); 
       
ob_end_clean(); 

        return
$content . "<!-- $bo_table : cached$ftime next$nextUpdate -->";
}

  • bbs/write_comment_update.php
  • bbs/delete.php
  • bbs/delete_all.php
  • bbs/delete_comment.php

    1. 맨 마지막줄 쯤 goto_url 함수 윗줄에 다음을 추가 ( 파일 4개 모두 동일 ) -->
if( is_file("$g4[path]/data/cache_latest/cache_$write_table.tmp") ) unlink("$g4[path]/data/cache_latest/cache_$write_table.tmp");
  • bbs/write_update.php

    1. 맨 마지막줄 쯤 if ($file_upload_msg) 윗줄에 다음을 추가
if( is_file("$g4[path]/data/cache_latest/cache_$write_table.tmp") ) unlink("$g4[path]/data/cache_latest/cache_$write_table.tmp");

마치며

허접한 팁 끝까지 읽어주셔서 감사합니다. ^^
 
* 다쓰고 보니 두서가 없게 쓴거 같아 다시 정리해서 올렸습니다.
추천
6

댓글 12개

아직 적용은 안해봤으나 좋은 팁입니다.. 기존의 메인페이지 Cache는 해봤는데 속도차이가 별로 안나더군요..
적용해봐야 겠네요..
아.. 나중에 DB가 커지거나 하면.. 상당히 유용하겠군요 .. 이걸응용해서 랭킹도 하루단위로 보여줄수 있겟군요..
절실히 필요한 기능이라 반가운 마음에 바로 적용시켜봤습니다만,
아쉽게도 썸네일이 안뜨니, 안타까은 마음입니다.
최근 글 스킨 중에 웹진형 elpis_webzine10 을 즐겨 사용하는데, 캐쉬를 적용하면 썸네일이 아예 뜨지 않습니다.
썸네일의 경로문제인 듯한데, 스킨의 소스를 눈이 아프게 살펴봐도 해답을 찾지 못하겠네요.
썸네일을 띄워야 하기에 원위치로 되돌렸습니다.
일단 추천 한방 날리고,
...
늘 신경쓰이는 부분인데 좋은 팁 감사 드립니다

그런데 혹시,,,아래코드
if( !is_dir("$g4[path]/cache_latest") ) {
@mkdir("$g4[path]/data/cache_latest", 0707);
@chmod("$g4[path]/data/cache_latest", 0707);
}
즉 디랙토리 찾는 부분이
if( !is_dir("$g4[path]/cache_latest") ) {  //<--이것이

if( !is_dir("$g4[path]/data/cache_latest") ) { //<-- 요렇게 바뀌어야 되지 않는지요?

아울러 질문 드립니다.
레코드수가 100 정도 되구요
약 3초마다 조건문에 부합되는 레코드 하나씩 쿼리 한다면
파일시스템과 디비이용과 효율면에서 의견좀 부탁 드립니다.
전체 3,313 |RSS
그누4 팁자료실 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT