그누커뮨 GNUboard COMmUNities
트위터아이디로 로그인하기트위터ID로 로그인
열심히 활동하셔서 모은 그누커뮨 포인트는 이곳에서 현금처럼 사용할 수 있습니다.
프로그램 License 1 copy는 1 site에만 사용하실 수 있습니다.
License 추가구매는 50% 가격에 가능합니다. (한 번 구매한 경우 [재구매]링크가 생김)
다른 곳에 업로드하거나 변형시켜 유포하는 행위는 저작권법에 저촉되며 법적 처벌을 받게 됩니다.
 
작성일 : 10-04-16 00:10
말러캐시 0.90 - 그누보드 속도를 올리는 cache 시스템
 글쓴이 : 말러83
조회 : 11,861  
키워드 : 속도향상, DB부하, 속도, 캐시, 그누보드, 말러캐시
오토스크랩 : 일괄 스크랩 오토스크랩 설정 네이버 블로그로 스크랩 다음 블로그로 스크랩 이글루스로 스크랩 티스토리로 스크랩 텍스트큐브로 스크랩 트위터로 보내기
 가격 : 0 point
   m3cache.utf8.zip (2.7K) [63] DATE : 2010-04-17 13:59:49
   m3cache.euckr.zip (2.6K) [44] DATE : 2010-04-17 13:59:49
[모듈소개]
페이지에서 DB에 부하를 많이 주지만 매번 불러올 필요가 없는 정보들이 있습니다.
예를 들어 최근게시물이 잔뜩 나열된 메인 페이지가 있을 때, 그 페이지를 캐싱을 해두고
10초에 한번씩만 리프레시 시켜주면 DB 부하를 매우 줄일 수 있습니다.

말러캐시는 일단 한 번 php코드를 실행시켜서 html코드를 생성해두고, 그 주기가 지나지
않았을 경우에는 저장해둔 html코드를 뿌려주는 방식으로 작동합니다. 물론 그 html코드는
DB에 저장해두지만, 저장해둔 html코드를 불러오는 쿼리만 날리면 되니 훨씬 빨라지게 됩니다.

[설치방법]
1. 압축을 풀어 그누보드 루트에 복사
 - extend 폴더에 m3cache.extend.php
 - m3cache 폴더에 _common.php, dbinstall.php, m3counter.m3cache.php, img폴더

2. 홈페이지주소/m3cache/dbinstall.php를 주소창에 쳐서 1회 실행
 - 캐시용 DB를 생성하는 쿼리입니다.

[사용방법]
1. 캐시를 할 부분의 코드를 잘라내서 /m3cache/example.m3cache.php라는 파일에 저장
 - 원하는이름.m3cache.php 라는 형태의 이름으로 저장하면 됩니다.

2. 잘라낸 부위를 대신해 m3cache("example", 10); 이라고 입력
 - 10초 단위로 캐시하라는 의미입니다. 두번째 인수는 생략하면 60초가 기본값입니다.
 - 3번째 인수는 변수입니다. 레벨에 따라 각각 다른 화면이라면 다음과 같이 합니다.
    m3cache("example", 10, $member[mb_level]);

3. 캐시하는 부분에 필요한 변수가 추가로 있다면 m3cache.extend.php 3번째 줄에 더 넣어줘야 합니다.
 - 예를 들어 global $g4, $member, $mmm, $temp; 이런 식으로

4. 끝 -_-;
 - m3counter가 예제로 들어있으니, 적당한 위치에 m3cache("m3counter"); 라고 입력해보세요.

[주의사항]
 - 3번째 인수로 2가지를 사용해야 하는 경우 그냥 두 변수를 붙여 써보세요.
    예를 들어 레벨과 성별에 따라 달라지는 화면이면...
    m3cache("example", 30, $member[mb_level].$member[mb_sex]);
 - 생성하는 파일은 /m3cache/파일이름.m3cache.php 와 같은 형태로 이름을 붙여야 합니다.
 - 2번째, 3번째 인수는 생략 가능합니다.
 - 무료 팁이지만 첨부파일의 재배포는 금합니다. 링크와 함께 퍼가는 건 환영합니다.

[피드백 및 오류신고]
 - http://gnucomun.net/sp/module.176

게시물의 저작권은 별도 표시가 없는 한 작성자에게 있습니다.
게시물 주소 : http://gnucomun.net/sp/module.176
8.2 (17명)
평가해주세요. 비회원 가능!
시하 10-04-21 01:40
 
시하입니다.
말러님이 그누에 공개해주신 이 팁으로 전 정말 눈에 보이는 싸이트 속도 향상을 보게 되었습니다.
이점 다시한번 고개 숙여 감사드립니다.

물론 이 팁이 공개되고 뒤이어 좀 더 발전된 방식의 불당님 방식이 공개되었지만...
전 말러님의 이 팁이 더 직관적이고 사용하기 편해서 많은 도움을 받고 있습니다.
(두분의 캐싱방식이 같은것으로 보이는데...전 이상하게도 말러님의 팁이 좀 더 빠른것으로 나옵니다..^^;;)


제가 여쭤보려는 것은.. 
사용중에 좀 아리까리..^^;; 한 것이 있어서입니다.

늘 운영중인 싸이트에 무언가 적용하기전에
제 그누보드 연습장에 먼저 적용하는데...
여기서 발생하는 문제입니다.
(그누보드 원본에 전혀 손을 대지 않았습니다.)

http://gnuholic.com/ing/index.php

위 페이지를 보시면 상단의 네비게이션이
그누보드의 그룹/보드 테이블을 불러와서
자동으로 나오는 메뉴입니다.

이 소스는 오래전부터 그누에 공개된 그 방식 그대로 사용중입니다만...
이 부부닝 늘 디비를 읽어 드리는 부분이다보니..(또 그룹이나 테이블은 거의 변경되지 않고)
말러님의 이 팁을 이용해 디비 부하를 없에려고 합니다.

그런데...적용이 않됩니다.

해당부분의 소스를 topnavi.m3cache.php로 저장하고
head.php에서 <?=m3cache("topnavi");?> 로 적용하면
topnavi.m3cache.php의 소스 부분중 문제가 있다고 에러메시지를 토해 내는군요.

물론 topnavi.m3cache.php 의 소스중 외부 php 파일의 인클루드는 전혀 없습니다.

소스의 내용중...

--------------------------------------------------------------------------------------------------------------------------------------------------
$excgr = "('html', 'banner', 'guest', '02_bbs', 'admin', 'bbs')"; // html , banner , guest 라는 그룹은 제외시킴

$sql = " SELECT a.gr_id, a.gr_subject, a.gr_use_access, a.gr_9, a.gr_10, b.mb_id FROM $g4[group_table] AS a LEFT JOIN $g4[group_member_table] AS b ON a.gr_id = b.gr_id WHERE (b.mb_id = '$member[mb_id]' AND a.gr_use_access = '1' ) OR a.gr_use_access = '0' and a.gr_id not in " . $excgr . " ORDER BY a.gr_1";

$result = sql_query($sql);

echo "<ul class='first_ul'>\n";


for ($i=0; $row=sql_fetch_array($result); $i++) {

$gSubject = ($row['gr_id'] == $gr_id)?$row['gr_subject']:$row['gr_subject'];//그룹제목
$glink = (!empty($row['gr_10']))?$row['gr_10']:$g4[path].'/bbs/'.'group.php?gr_id=' .$row['gr_id'];//그룹링크

if ($row['gr_id'] == $gr_id) {
echo "<li class='first_li selected'><a href='$glink' class='first_a sub first_sub'><span><script type=\"text/javascript\">pretty2Font(\"{$gSubject}\");</script></span></a>\n";
echo "<ul class='second_ul'>\r\n";
} else {
echo "<li class='first_li'><a href='$glink' class='first_a sub first_sub'><span><script type=\"text/javascript\">prettyFont(\"{$gSubject}\");</script></span></a>\n";
echo "<ul class='second_ul'>\r\n";
}


$sqlb = " select bo_subject, bo_table, bo_category_list, bo_9, bo_10 from $g4[board_table] where (bo_list_level <= $member[mb_level]) and (gr_id = '$row[gr_id]') order by bo_order_search";
  $resultb = sql_query($sqlb);
  for ($j=0; $rowb=sql_fetch_array($resultb); $j++) {
$tmp_write_table = $g4[write_prefix] . $rowb[bo_table];
$tmp_write_table_category = $g4[write_prefix] . $rowb[bo_table] . $rowb[bo_category_list];

--------------------------------------------------------------------------------------------------------------------------------------------------

$sqlb = " select bo_subject, bo_table, bo_category_list, bo_9, bo_10 from $g4[board_table] where (bo_list_level <= $member[mb_level]) and (gr_id = '$row[gr_id]') order by bo_order_search";

이 부분이 에러를 보입니다.

에러메시지는
select bo_subject, bo_table, bo_category_list, bo_9, bo_10 from g4_board where (bo_list_level <= ) and (gr_id = 'font') order by bo_order_search<p>1064 : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') and (gr_id = 'font') order by bo_order_search' at line 1<p>error file : /ing/index.php

위와 같습니다.

물론 위 소스를 그냥 topnavi.php 로 만
시하 10-04-21 01:41
 
글이 잘리는 군요...ㅠㅠ



물론 위 소스를 그냥 topnavi.php 로 만든 후 head.php 파일에서 인클루드시키면 아무런 문제 없이 잘 적용됩니다.

왜 그런지 혹...집히는 부분이 있으면 도움좀 부탁 드립니다.
말러83 10-04-21 09:19
 
m3cache.include.php의 3번째 줄에 $member도 전역변수에서 불러오도록 추가해주세요.
(bo_list_level <= )
이렇게 된 부분에 $member[mb_level] 값이 없는 것으로 나오는데, 함수화 시켜서 tobnavi.php를 실행시키는 과정에서 $member 변수를 지역변수로 인식해서 그런 것 같습니다.
뉴스타 10-05-11 23:45
 
초보가 따라할려니 어렵네요 ㅋㅋ
<?
function m3cache($name, $sec="60", $var="") {
global $g4, $member, $board, $config;
$cache = sql_fetch("select ca_name, ca_content, ca_datetime from `m3_cache` where ca_name='$name' AND ca_var='$var'");
if(!$cache) {
ob_start();
include_once("$g4[path]/index.php");
$ca_content = ob_get_contents();
ob_end_clean();
sql_query("insert into `m3_cache` set ca_var='". addslashes($var) ."', ca_content = '". addslashes($ca_content) ."', ca_datetime=NOW(), ca_updates='0', ca_name='$name'");
echo $ca_content;
}
else {
if(time() - strtotime($cache[ca_datetime]) < $sec) { // 캐싱된 내용 보여주기
echo $cache[ca_content];
} else { // 새로 내용 가져와 캐시 저장하고
뉴스타 10-05-11 23:49
 
include_once("$g4[path]/m3cache/{$name}.m3cache.php");
를 include_once("$g4[path]/index.php");
로 바꾸면 메인 인덱스가 캐싱 되는가요 ?
     
말러83 10-05-12 12:22
 
index.php에서 캐싱할 부분의 코드를 잘라내서 /m3cache/abcdefg.m3cache.php 라는 파일에 옮겨놓고,
잘라낸 부분에는 <? m3cache("abcdefg") ?> 라고 입력해보세요.
이브 10-07-01 09:27
 
궁금한게 있는데요...
index.php에서 최근게시물을 캐싱할려면...
예를 들어서..<?=latest(text', 'trend', 4, 20);?>를 잘라서 넣는게 아니라...
latest.skin.php의 내용을 latest.m3cache.php를 파일에 옮겨 넣는건지요...????

그럴경우에.....<?=latest(text', 'trend', 4, 20);?>를 넣는것은 어떻게 설정하는지 궁금합니다.
말러83 10-07-01 09:52
 
그냥 <?=latest('text', 'trend', 4, 20);?> 라고 저장하시면 됩니다.
게시판이 여러개면
<?
echo latest('text', 'trend', 4, 20);
echo latest('text1', 'trend', 4, 20);
echo latest('text2', 'trend', 4, 20);
echo latest('text4', 'trend', 4, 20);
echo latest('text5', 'trend', 4, 20);
?>
이런식으로 만들어도 되고요
     
이브 10-07-01 11:25
 
<?=latest(text', 'trend', 4, 20);?>의 함수가 여러개일 경우
아래처럼 할경우....디자인이 따로 일경우에 위치를 잡기 힘들지 않나여?
<?
echo latest('text', 'trend', 4, 20);
echo latest('text1', 'trend', 4, 20);
echo latest('text2', 'trend', 4, 20);
echo latest('text4', 'trend', 4, 20);
echo latest('text5', 'trend', 4, 20);
?>
          
말러83 10-07-01 12:45
 
<table>
<tr><td><?=latest("bo1", "basic", 5)?></td>
    <td><?=latest("bo2", "trend", 5)?></td>
</tr>
<tr><td>여기는 비어있어요</td>
    <td><img src="hotchick.png" /></td>
</tr>
</table>

이런식으로 넣어도 돼요. 그냥 넣고 싶은 내용을 아무거나 넣어두면 그걸 전체적으로 html 코드 형식으로 캐시하는 방식이니까요.
homy 10-10-11 19:35
 
<?
include_once("./_common.php");
$g4[title] = "월별 포인트 적립 순위";
include_once("$g4[path]/head.sub.php");
echo "<script language=\"javascript\" src=\"$g4[path]/js/sideview.js\"></script>\n";

$nowdate = date("Y-m",time()); // 이번달
$sYear = substr($nowdate, 0, 4)."년";
$sMonth = substr($nowdate,5,2)."월";

$sql = "SELECT * , COUNT(B.mb_id ) AS count, SUM( B.po_point ) AS point
FROM  $g4[member_table] as A
LEFT JOIN $g4[point_table] as B ON ( A.mb_id = B.mb_id AND A.mb_level < 8 AND A.mb_point >= 3000) where date_format(B.po_datetime,'%Y-%m') = '$nowdate' group by B.mb_id order by point desc LIMIT 0, 10 ";

$result = sql_query($sql);
?>
<table width="185" border="0" cellpadding="0" cellspacing="0" align="center">
<tr>
<td colspan="4" valign="bottom" height="27"><img src="images/point10_title.png"></td>
</tr>
<tr><td colspan="4" height="3"></td></tr>
<?
for ($i=1; $row=sql_fetch_array($result); $i++)
{
$name = get_sideview($row[mb_id], $row[mb_nick], $row[mb_email], $row[mb_homepage]);
$point = number_format($row[point]);
$mb_point= number_format($row[mb_point]);
?>
<tr>
<td height="24"><img src="<?=$g4['path']?>/img/rank/<?=$i?>.gif" border="0" align=absmiddle></td>
<td class="small" style="padding-left:8px;"><?=$name?></td>
<td class="small" align="right" style="color:#FF6C00;"><?=$point?></td>
<td class="small" align="right" style="color:#8E9B91;padding-right:3px;"><?=$mb_point?></td>
</tr>
<tr>
<td colspan="4" bgcolor="#000000" height="1"></td>
</tr>
<?}?>
</table>
월별 포인트 랭킹인데 이대로 말러캐쉬 적용 해보니 안되더라구요.
어떻
     
말러83 10-10-11 19:54
 
$nowdate 부터 내용만 따로 파일을 만들어서 적용해보세요
     
말러83 10-10-12 09:05
 
따옴표가 전부 익스케이프 되어서 문제가 생긴 것 같네요. 왜 그런지는 저도 모르겠습니다.
김선만 11-04-05 10:32
 
조금 빠릅니다. 좀더 해 보면 더 빠르겠지요.

m3cache("example", 10); 뒤에 10 이 있는것과 없는 것 차이는 뭔지...;;

10초와 60초 차이??? 선생님께서 어느 것을 추천하고 싶으신지요. ^^

감사합니다. 고맙습니다.

잘 사용하겠습니다.
     
말러83 11-04-06 11:46
 
글이 자주 올라오고 방문하는 사람이 많다면 60초를 권해드립니다.
60초라는 것은 실제로 변화가 생긴(대부분의 경우 글이 올라온) 뒤에 약 평균 30초만에 캐싱된 화면도 바뀐다는 뜻입니다. 1분에도 몇개씩 글이 올라오는 경우라면 10초로 해야겠지만, 그게 아니면 60초로도 문제 없을 겁니다.^^
김선만 11-04-07 03:51
 
넵 감사합니다.
고맙습니다.
신비나라 11-11-01 17:06
 
말러캐시 0.90 - 그누보드 속도를 올리는 cache 시스템
이부분이 이해가 안가서 쪽지드립니다. 최근게시물을
캐시를 할 부분의 코드를 잘라내서 /m3cache/example.m3cache.php라는 파일에 저장이라고 하셨는데요 그러면 latest.skin.php의 내용을 latest.m3cache.php로 저장한다음에
예전과 같이 <?=latest("basic", "free", 5, 28); ?>이렇게 불러주면되는건가요... 이해가 잘가지를 않아서요..답변 좀 꼭 부탁드리겠습니다. 사이트가 너무느려져서 말러님의 팁을 적용시키려고하는데 잘안되네요. 테이블생성과 파일은 다 올린상태입니다. 감사합니다.
     
말러83 11-11-02 09:38
 
example.m3cache.php 파일에 <?=latest("basic", "free", 5, 28); ?> 이라고 적어두고,
그 부분을 대신해 m3cache("example", 10); 이라고 입력하면 됩니다
          
신비나라 11-11-02 15:33
 
말러님 덕분에 해결했습니다. m3cache("example", 10); 이렇게했을땐 차이를 못느끼다가 m3cache("example", 60); 이렇게 바꾸니 속도가 엄청빨라지네요 대단히 감사합니다.
스누파이 11-12-19 23:33
 
말러님 다른곳은 잘 적용되었는데 아래의 코드 적용이 잘 적용이 안되네요..
해결방안좀 짚어주세요
<?
    달러main_type = 달러row_auth2[mb_auth_check];
      달러type = 3;
    if (달러default["de_type{달러type}_list_use"])
      {
        best_display_type(달러main_type, 달러type, 달러default["de_type{달러type}_list_skin"], 4, 달러default["de_type{달러type}_list_row"], 달러default["de_type{달러type}_img_width"], 달러default["de_type{달러type}_img_height"]);
?>
//달러수식이 들어가면 댓글입력이 안되어 한글로 적어놨습니다.
     
말러83 11-12-21 10:03
 
어떻게 안되나요?
하이염 12-05-31 20:02
 
* 비밀글 입니다.
     
말러83 12-06-05 17:16
 
해당 부분의 코드를 불러보세요
          
하이염 12-06-08 15:40
 
* 비밀글 입니다.
               
말러83 12-06-08 15:45
 
봐도 잘 모르겠군요... 죄송합니다
                    
하이염 12-06-08 16:07
 
아뇨아뇨 제가 더 죄송하죠...

좋은 팁 잘 쓰고 있습니다!
호구호구 13-12-22 10:21
 
캬 놀랍네요 ㅋㅋ
저는 직접 제작해서 썻었는데 역시 말러님꺼랑 제가 만들거랑 비교하니 ㅋ 아직 저는 하찮은 개발자네요 ㅠ

말러님껄로 교체하니깐... 속도 10배 상승... 진심입니다. 아이고..

function cache_service($filename,$time,$content){
 if(!file_exists($filename) or (filemtime($filename)+$time) < time('t')){
  $f = fopen($filename,"w");
  fwrite($f,$content);
  fclose($f);
  echo $content;
 }else{
  readfile($filename);
 }
}

말러님!! 궁굼한게 있습니다.
cron 기능 있잔습니까!!

1시간 마다 설정해놓을경우 아무나 1사람이 접속하면 접속한 시점에 실행이 되는거죠?!
     
말러83 13-12-29 14:16
 
네 기본적으로 그렇습니다
 
 

Total 20
번호 제   목 글쓴이 가격 평점 날짜 조회
20 월별 검색어 변화 추이 - m3PopularRanking (4) 말러83 무료 7.55 09-11 11235
19 그누트윗 1.01 - 그누보드와 트위터 연동 모듈 (44) 말러83 무료 8.80 07-04 13927
18 그누트윗 1.00 - 그누보드와 트위터 연동 모듈 (31) 말러83 무료 7.60 06-30 12004
17 그누트윗 0.90 - 그누보드와 트위터 연동 스킨 (18) 말러83 무료 9.17 06-18 10352
16 그누 블로그 스타일 - m3blog 0.90 (8) 말러83 무료 9.21 06-16 8941
15 그누보드용 cron 기능 - m3cron ver 1.11 (26) 말러83 무료 9.50 05-07 17288
14 말러캐시 0.90 - 그누보드 속도를 올리는 cache 시스템 (28) 말러83 무료 8.18 04-16 11862
13 탭 최신글 (9) 유아원 무료 7.89 01-12 5633
12 말러센스 오토스크랩 베타 ver0.93 (100) 말러83 무료 8.11 12-09 15026
11 그누보드용 XMLRPC 서버, metaWeblog.newPost api (2) 말러83 무료 7.50 12-06 7286
10 [사용불가]그누보드 트위터 자동등록 스킨 만들기 (25) 말러83 무료 7.67 12-03 12736
9 m3googlesitemap ver1.23 - 그누보드용 구글 xml 싸이트맵 생성기 (22) 말러83 무료 10.00 11-16 14863
8 m3counter 1.12 - 초깔끔 방문자수 표시 모듈 (4) 말러83 무료 8.00 11-10 6722
7 달력 출석부 (23) 유아원 무료 9.19 10-14 11007
6 m3counter 1.11 - 초깔끔 방문자수 표시 모듈 (2) 말러83 무료 7.40 09-30 9829
 1  2  

Copyright ⓒ그누커뮨(http://gnucomun.net) All rights reserved.