최신글 함수에 Cache 기능을 넣어보자!
페이지 정보
작성자 차동박 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 댓글 0건 조회 18,619회 작성일 08-04-18 16:07본문
최신글 함수에 Cache 기능을 넣어보자!
글쓴이 : 아이리프 (222.♡.5.161) 조회 : 757 추천 : 3
latest.lib.php (2.7K) [9] DATE : 2007-05-08 20:00:57
http://www.teambh.net [63]
안녕하세요! www.teambh.net 을 운영하는 Airif 라고 합니다.
그동안 쭉 도움만 받다가 처음을 글을 올려 봅니다. 모두 잘 부탁드리겠습니다. :)
이 팁은 아주 간단한 방법으로 최신글 출력을 캐싱해서 파일로 저장해 놓는 방법입니다.
보통 메인페이지에 최신글을 많이 쓸경우 DB 접근할때의 부하를 무시할 수 없겠죠. 캐싱을 통해 DB가 아닌 파일로부터 직접 최신글을 받아 좀더 빠른 페이지접근을 할 수 있습니다.
TEAMBH.net 기준 적용 결과
최신글 캐싱 적용 전 메인 페이지 로딩속도 : 0.51034808158875 초
최신글 캐싱 적용 후 메인 페이지 로딩속도 : 0.024719953536987 초
약 20배 정도 빨라졌습니다 :)
메인페이지 로딩이 최신글 때문에 느리신 분들은 한번 적용해 보시기 바랍니다.
경우에 따라선 비효율적 일수도 있습니다. (예: 글이 매우 자주 포스팅되는 게시판, 스킨에서 직접 DB 로부터 실시간데이터를 가져올 경우.)
팁란에 올리기도 뭐한 단순한 코드지만 용기를 내어 올려봅니다 좋은 의견 부탁드리겠습니다.
동작원리
latest 함수에서 처음 해당 보드의 캐시파일을 찾습니다. 없으면 새로 캐시파일을 만듭니다.
캐시파일이 있으면 DB에 접근 하지 않고 캐시파일을 대신 뿌려줍니다.
하지만 업데이트 시간이 되면, 캐시파일이 있더라도, 무조건 새로 캐싱합니다. ($update_time 을 수정해 업데이트 시간을 조절할 수 있습니다.)
글이나 코멘트가 추가/삭제/수정 되면, 캐시파일을 삭제합니다.
참고
캐시파일이 저장되는 곳은 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
latest 함수의 global $g4; 아랫줄에 다음을 추가 --> if( $content = open_cache($bo_table) ) return $content;
latest 함수의 ob_end_clean(); 다음에 다음을 추가 --> write_cache($tmp_write_table,$content);
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
맨 마지막줄 쯤 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
맨 마지막줄 쯤 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");
마치며
허접한 팁 끝까지 읽어주셔서 감사합니다. ^^
* 다쓰고 보니 두서가 없게 쓴거 같아 다시 정리해서 올렸습니다.
글쓴이 : 아이리프 (222.♡.5.161) 조회 : 757 추천 : 3
latest.lib.php (2.7K) [9] DATE : 2007-05-08 20:00:57
http://www.teambh.net [63]
안녕하세요! www.teambh.net 을 운영하는 Airif 라고 합니다.
그동안 쭉 도움만 받다가 처음을 글을 올려 봅니다. 모두 잘 부탁드리겠습니다. :)
이 팁은 아주 간단한 방법으로 최신글 출력을 캐싱해서 파일로 저장해 놓는 방법입니다.
보통 메인페이지에 최신글을 많이 쓸경우 DB 접근할때의 부하를 무시할 수 없겠죠. 캐싱을 통해 DB가 아닌 파일로부터 직접 최신글을 받아 좀더 빠른 페이지접근을 할 수 있습니다.
TEAMBH.net 기준 적용 결과
최신글 캐싱 적용 전 메인 페이지 로딩속도 : 0.51034808158875 초
최신글 캐싱 적용 후 메인 페이지 로딩속도 : 0.024719953536987 초
약 20배 정도 빨라졌습니다 :)
메인페이지 로딩이 최신글 때문에 느리신 분들은 한번 적용해 보시기 바랍니다.
경우에 따라선 비효율적 일수도 있습니다. (예: 글이 매우 자주 포스팅되는 게시판, 스킨에서 직접 DB 로부터 실시간데이터를 가져올 경우.)
팁란에 올리기도 뭐한 단순한 코드지만 용기를 내어 올려봅니다 좋은 의견 부탁드리겠습니다.
동작원리
latest 함수에서 처음 해당 보드의 캐시파일을 찾습니다. 없으면 새로 캐시파일을 만듭니다.
캐시파일이 있으면 DB에 접근 하지 않고 캐시파일을 대신 뿌려줍니다.
하지만 업데이트 시간이 되면, 캐시파일이 있더라도, 무조건 새로 캐싱합니다. ($update_time 을 수정해 업데이트 시간을 조절할 수 있습니다.)
글이나 코멘트가 추가/삭제/수정 되면, 캐시파일을 삭제합니다.
참고
캐시파일이 저장되는 곳은 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
latest 함수의 global $g4; 아랫줄에 다음을 추가 --> if( $content = open_cache($bo_table) ) return $content;
latest 함수의 ob_end_clean(); 다음에 다음을 추가 --> write_cache($tmp_write_table,$content);
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
맨 마지막줄 쯤 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
맨 마지막줄 쯤 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");
마치며
허접한 팁 끝까지 읽어주셔서 감사합니다. ^^
* 다쓰고 보니 두서가 없게 쓴거 같아 다시 정리해서 올렸습니다.
관련링크
댓글목록
등록된 댓글이 없습니다.