불당님 db_cache팁 활용해서 최근게시물들 캐쉬처리하기. 정보
불당님 db_cache팁 활용해서 최근게시물들 캐쉬처리하기.
본문
불당님 db_cache 팁 원문주소
http://sir.co.kr/bbs/board.php?bo_table=g4_tiptech&wr_id=23351일단 캐쉬는 필요하신분이 있고 필요없으신 분이 있습니다.
부하가 일어나지 않는다면 굳이 적용하실 필요는 없습니다.
(php 초보자분에게는 적용방법이 어려울 수 있습니다.)
해당 게시물은 다음과 같은 상황에서 작업되었습니다.
1. 메인화면에 최근게시물로 불러오는 게시판 - 27개 / 약 147개의 게시물
2. 메인화면에 통합최신글 - 14개, 통합최근코멘트 - 20개
3. 평균 동접자수 10~30명
4. 신규 게시물, 신규코멘트의 등록보다는 그냥 읽는 사람이 많음
5. 서버호스팅이 아닌 일반 호스팅을 받고 있는 상황
작업후(작업전이 없네요.ㅠ) webwait.com에서 메인화면 5초 딜레이 5번 접속 결과
http://webwait.com/stylesheets/dataTables/sort_both.jpg); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; width: 0px; background-position: 100% 50%; background-repeat: no-repeat no-repeat; "># | http://webwait.com/stylesheets/dataTables/sort_both.jpg); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; width: 0px; background-position: 100% 50%; background-repeat: no-repeat no-repeat; ">URL | http://webwait.com/stylesheets/dataTables/sort_asc.jpg); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; width: 0px; background-position: 100% 50%; background-repeat: no-repeat no-repeat; ">Average | http://webwait.com/stylesheets/dataTables/sort_both.jpg); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; width: 0px; background-position: 100% 50%; background-repeat: no-repeat no-repeat; ">Median | http://webwait.com/stylesheets/dataTables/sort_both.jpg); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; width: 0px; background-position: 100% 50%; background-repeat: no-repeat no-repeat; ">StdDev |
---|---|---|---|---|
1 | ****** | 0.26 | 0.21 | 0.08 |
작업진행방향
1. 글 등록시 bbs/write_update.php 에서 캐쉬생성
2. 코멘트 등록시 bbs/write_comment_update.php 에서 캐쉬생성(최근게시물에 들어가는 녀석들만)
3. 글삭제시 캐쉬생성 bbs/delete 관련 파일 3개
작업진행
0. db_cache 불당님 게시물에서 함수 사용법을 익히고 사전작업(db생성 등)을 한다.
1. db_cache 함수 수정
function db_cache($c_name, $seconds=300, $c_code, $go_cache="yes") {
// 2011-02-02 수정.jsh. $go_cache 값이 db_write인 경우 결과값으로 1만 리턴, no인 경우 시간과 관계없이 캐쉬생성된걸 그대로 씀
// write_update.php, write_comment_update.php 에서 글이 등록될 경우 및 글이 삭제될 경우 캐쉬 생성
global $g4;
$result = sql_fetch(" select c_name, c_text, c_datetime from g4_cache where c_name = '$c_name' ");
if (!$result) {
// 시간을 offset 해서 입력 (-1을 해줘야 처음 call에 캐쉬를 만듭니다)
$new_time = date("Y-m-d H:i:s", $g4['server_time'] - $seconds - 1);
$result['c_datetime'] = $new_time;
sql_query(" insert into g4_cache set c_name='$c_name', c_datetime='$new_time' ");
}
$sec_diff = $g4['server_time'] - strtotime($result['c_datetime']);
if ($go_cache != "no" && ($sec_diff > $seconds || $go_cache == "db_write")) {
// $c_code () 안에 내용만 살림
$pattern = "/[()]/";
$tmp_c_code = preg_split($pattern, $c_code);
// 수행할 함수의 이름
$func_name = $tmp_c_code[0];
// 수행할 함수의 인자
$tmp_array = explode(",", $tmp_c_code[1]);
if ($func_name == "include_once" || $func_name == "include") {
ob_start();
include($tmp_array[0]);
$c_text = ob_get_contents();
ob_end_clean();
} else {
// 수행할 함수의 인자를 담아둘 변수
$func_args = array();
for($i=0;$i < count($tmp_array); $i++) {
// 기본 trim은 여백 등을 없앤다. $charlist = " \t\n\r\0\x0B"
$tmp_args = trim($tmp_array[$i]);
// 추가 trim으로 인자를 넘길 때 쓰는 '를 없앤다
$tmp_args = trim($tmp_args, "'");
// 추가 trim으로 인자를 넘길 때 쓰는 "를 없앤다
$func_args[$i] = trim($tmp_args, '"');
}
// 새로운 캐쉬값을 만들고
$c_text = call_user_func_array($func_name, $func_args);
}
// db에 넣기전에 slashes들을 앞에 싹 붙여 주시고
$c_text1 = addslashes($c_text);
if(!$c_text1) $c_text1 = "입력오류";
// 새로운 캐쉬값을 업데이트 하고
sql_query(" update g4_cache set c_text = '$c_text1', c_datetime='$g4[time_ymdhis]' where c_name = '$c_name' ");
if($go_cache == "db_write") {
return 1;
} else {
// 새로운 캐쉬값을 return (slashes가 없는거를 return 해야합니다)
return $c_text;
}
} else {
// 캐쉬한 데이터를 그대로 return
return $result['c_text'];
}
}
2. latest함수 수정
function latest($skin_dir="", $bo_table, $rows=10, $subject_len=40, $options="")
{
global $g4, $sh_board_name, $gr_id, $last_wr_id;
$latest_skin_path = "$g4[path]/skin/latest/$skin_dir";
$list = array();
$tmp_write_table = $g4['write_prefix'] . $bo_table; // 게시판 테이블 전체이름
$sql = " select wr_id, wr_subject, wr_comment, wr_option from $tmp_write_table where wr_is_comment = 0 order by wr_num limit 0, $rows ";
$result = sql_query($sql);
for ($i=0; $row = sql_fetch_array($result); $i++)
$list[$i] = get_latest($row, $bo_table, $latest_skin_path, $subject_len);
$last_wr_id[$bo_table] = $list[$i-1]['wr_id']; // 최근게시물의 마지막 wr_id를 변수에 저장, 코멘트업데이트시 캐쉬생성판단자료로 쓴다.
ob_start();
$board['bo_subject'] = $sh_board_name[$bo_table];
include "$latest_skin_path/latest.skin.php";
$content = ob_get_contents();
ob_end_clean();
return $content;
}
해당 함수는 제가 사용하는 환경에 맞춘 함수라서 수정이 필요합니다.
사용하시는 함수에서 추가할 부분은 두분입니다.
global $g4, $last_wr_id;
ob_start(); 윗줄에
$last_wr_id[$bo_table] = $list[$i-1]['wr_id']; // 최근게시물의 마지막 wr_id를 변수에 저장, 코멘트업데이트시 캐쉬생성판단자료로 쓴다.
3. 캐쉬관련 정보를 담을 $cache_set 배열 생성
대충 생성해서 extend폴더에 두시든가 하면 될 듯 합니다.
사용하시는 환경에 맞춰(원래 사용하는 최근게시물 소스에 맞춰 다음 예시처럼 작성하면 됩니다.
// $cache_set["게시판아이디"]['cache_name'] = "db_cache에서 캐쉬네임이 됩니다";
// $cache_set["게시판아이디"]['cache_value'] = "db_cache에서 캐쉬적용 함수가 됩니다. 최신글 사용하시는 거 그대로 넣으시면 되겠지요";
$cache_set["B11"]['cache_name'] = "latest_B11";
$cache_set["B11"]['cache_value'] = "latest('sh.list', 'B11', 9, 44)";
$cache_set["B14"]['cache_name'] = "latest_B14";
$cache_set["B14"]['cache_value'] = "latest('sh.list', 'B14', 3, 44)";
$cache_set["B12"]['cache_name'] = "latest_B12";
$cache_set["B12"]['cache_value'] = "latest('sh.list', 'B12', 3, 44)";
$cache_set["B19"]['cache_name'] = "latest_B19_left";
$cache_set["B19"]['cache_value'] = "latest('sh.list', 'B19', 7, 28)";
4. bbs/write_update.php 수정
include_once("./_common.php");
include_once("$g4[path]/lib/latest.lib.php");
include_once("./_common.php"); 아랫줄에 최신글 함수 인클루드
//------------------------------------------------------------------------------
// 가변 파일 업로드
// 나중에 테이블에 저장하는 이유는 $wr_id 값을 저장해야 하기 때문입니다.
// 캐쉬를 생성한다. 2011-02-02
해당 줄 위에 아래 소스 삽입
// $cache_set 변수에 정의된 것들만 캐쉬생성
if(is_array($cache_set[$bo_table])) {
db_cache($cache_set[$bo_table]['cache_name'], 17, $cache_set[$bo_table]['cache_value'], "db_write"); // 각 최근게시물 캐쉬
}
4. bbs/write_comment_update.php 수정
include_once("./_common.php");
include_once("$g4[path]/lib/latest.lib.php");
include_once("./_common.php"); 아랫줄에 최신글 함수 인클루드
// 포인트 부여
insert_point($member[mb_id], $board[bo_comment_point], "$board[bo_subject] {$wr_id}-{$comment_id} 코멘트쓰기", $bo_table, $comment_id, '코멘트');
아랫줄에 아래코드 삽입
// 2011-02-02 캐쉬생성
// 최근게시물에 출력되는 게시물이면 코멘트 등록시 최근게시물 캐쉬를 생성 아니면 캐쉬를 생성하지 않는다.
if($wr_id >= $last_wr_id[$bo_table]) {
if(is_array($cache_set[$bo_table])) {
db_cache($cache_set[$bo_table]['cache_name'], 17, $cache_set[$bo_table]['cache_value'], "db_write"); // 각 최근게시물 캐쉬
}
}
5. bbs/delete.php 수정
include_once("./_common.php");
include_once("$g4[path]/lib/latest.lib.php");
include_once("./_common.php"); 아랫줄에 최신글 함수 인클루드
// 사용자 코드 실행
@include_once("$board_skin_path/delete.skin.php");
아랫줄에 아래 소스 삽입
// 2011-02-03 캐쉬생성
// 최근게시물에 출력되는 게시물이면 코멘트 삭제시 최근게시물 캐쉬를 생성 아니면 캐쉬를 생성하지 않는다.
if($wr_id >= $last_wr_id[$bo_table]) {
if(is_array($cache_set[$bo_table])) {
db_cache($cache_set[$bo_table]['cache_name'], 17, $cache_set[$bo_table]['cache_value'], "db_write"); // 각 최근게시물 캐쉬
}
}
6. bbs/delete_all.php 수정
include_once("./_common.php");
include_once("$g4[path]/lib/latest.lib.php");
include_once("./_common.php"); 아랫줄에 최신글 함수 인클루드
// 사용자 코드 실행
@include_once("$board_skin_path/delete_all.skin.php");
아랫줄에 아래 소스 삽입
(삭제는 통상 일어나지 않으므로 판단하지도 말고 걍 생성했습니다.)
// 2011-02-03 캐쉬생성
if(is_array($cache_set[$bo_table])) {
db_cache($cache_set[$bo_table]['cache_name'], 17, $cache_set[$bo_table]['cache_value'], "db_write"); // 각 최근게시물 캐쉬
}
7. bbs/delete_comment.php 수정
include_once("./_common.php");
include_once("$g4[path]/lib/latest.lib.php");
include_once("./_common.php"); 아랫줄에 최신글 함수 인클루드
// 사용자 코드 실행
@include_once("$board_skin_path/delete_comment.skin.php");
아래줄에 아래 소스 삽입
// 2011-02-03 캐쉬생성
if($write[wr_parent] >= $last_wr_id[$bo_table]) {
if(is_array($cache_set[$bo_table])) {
db_cache($cache_set[$bo_table]['cache_name'], 17, $cache_set[$bo_table]['cache_value'], "db_write"); // 각 최근게시물 캐쉬
}
}
8. index.php 수정
원래
echo latest('sh.list', 'B11', 9, 44);
?>
이런식의 소스를 다음처럼 수정
echo db_cache("latest_B11", 17, "sh_latest('sh.list', 'B11', 9, 44)", "no");
?>
주의사항 캐쉬네임이 같아야 하니 다음처럼 적어주시면 혼란을 피할 수 있습니다.
db_cache($cache_set['B11']['cache_name'], 17, $cache_set['B11']['cache_value'], "no");
?>
이상으로 끝입니다~! 머 빠진게 없는가..;;
생각나는대로 적다보니 혹 빠진 부분이 있으면 추가하도록 하겠습니다.
위 소스들은 제가 사용하는 소스를 토대로 재구축했으며,
제가 사용하는 부분은 첨가사항이 조금 더 많습니다.
그래서 혹 소스 수정시 문제가 있을 경우 수정부탁드립니다. ^^;;
추천해주실꺼죠 ㅠ_ㅠ/
마지막으로 phpmyadmin에서 캐쉬 생성 타임을 복사해 보았습니다.
보시면 알겠지만 게시물 생성보다는 뷰가 압도적인 정보알림형 게시판들 같은 경우
어제 이후로 새롭게 캐쉬생성하지 않고 그대로 사용하고 있는걸 볼 수 있습니다.

추천
4
4
댓글 2개

게시물 스킨으로도 작업이 가능하겠습니다만, 저 같은 경우 늘 최근게시물이 출력되는 편이라
직접 수정을 했습니다. ~ㅅ~
직접 수정을 했습니다. ~ㅅ~
좋은 정보 감사합니다.