그누보드 튜닝 (get_sideview) (08.09.09)

불당   
   조회 6331   추천 0    

그누보드에서 많이 사용되는 함수중 하나가 get_sideview 입니다.

이 함수는 사용자 정보에 sideview를 쓰기 위해서 필수인데, 거의 대부분의
사이트에서 sideview를 쓰는 현실을 생각할 때 이곳에서의 속도 개선이 나름
중요할 수 있다는 생각을 했습니다. 

사실, 여러대의 웹서버간에 퍼스나콘을 파일형태로 매번 찾는 것이 데이타 sync에
문제가 많이 생겨서 개선해야 겠다 생각하고 코드를 보고  과정에서 이부분에서
속도를 저하하는 이유가 있다는 생각이 들었습니다.

get_sideview에는 ... if (file_exists($icon_file)) { ... 라는 코드가 있는데 퍼스나콘을
사용하는 사용자가 수천명인 경우(파일이 수천개라는 의미죠)에 이 코드가 어떻게
동작하게 될까요???? 목록보기를 했을 때 목록이 30개인 경우 30번의 file_exist 함수가
호출 됩니다. 안그래도 바쁜 웹서버에게 목록 한번 볼때마다 30번의 disk operation을
그것도 파일찾기를 시키는 것 입니다.

get_sideview의 호출 자체를 줄여주는 것 이외에는 코드의 수정이 너무 복잡해서
진행하다가 cancel 시켰습니다.

--

한페이지에 같은 사용자가 글을 10번 올렸다면? 그 사용자에 대해서 10번의 get_sideview를 실행합니다. 사실은 1번만 하면 되는 것인데, 지금의 코드에서는
무조건 get_sideview를 실행하게 하고 있어서 불필요한 10번의 file_exist가
실행되는 것 입니다.

속도를 높이기 위해서 (1)과 (2)를 모두 적용하셔도 되고 (1)의 적용이 부담스런
경우에는 (2)만 적용해도 됩니다.

common.lib.php의 가장 앞부분에 전역변수를 정의 합니다.

if (!isset($sideview))
    $sideview = array();

get_list 함수에서 ...

(1) 상단부의 global 변수 정의 바로 밑에 $sideview를 전역변수로 정의 합니다.

    $global $sideview;

(2) $sideview[mb_id]에 값이 없는 sideview에 대해서만 get_sideview를 실행

    원본을 아래처럼 수정
    $list['wr_homepage'] = get_text(addslashes($list['wr_homepage']));

    $tmp_name = get_text(cut_str($list['wr_name'], $config['cf_cut_name'])); // 설정된 자리수 만큼만 이름 출력
    $tmp_mb_id = $list['mb_id'];
    if ($board['bo_use_sideview'])
        if ($sideview[$tmp_mb_id]) { // 한번 불러온 정보가 있으면 그것을 사용
            $list['name'] = $sideview[$tmp_mb_id];
        } else {
            $list['name'] = get_sideview($list['mb_id'], $tmp_name, $list['wr_email'], $list['wr_homepage']);
            $sideview[$tmp_mb_id] = $list['name']; // 한번 불러온 사용자 정보를 임시저장
        }
    else
        $list['name'] = "<span class='".($list['mb_id']?'member':'guest')."'>$tmp_name</span>";

- opencode.co.kr -
돌하해몽 2008-07

밑에껀 적용 안하고 이것만 적용하면 되는건가요?
그리고 밑에있는 첨부파일 실행 안시켜도 되나요?

눈까리 2008-09

음.. get_list함수에서 sideview를 넣는다해서 달라질건 없어보이는 이유는 머죠 ^^;;
get_list가 한꺼번에 여러행의 값을 넘겨주지 않는 이상은 sideview = array가 필요없습니다. 함수에서 한번 사용된 변수는 바로 삭제가 되기 땜시롱.. $data = get_list()가 있는 부분 위에다 적용을 하셔야 제대로 효과를 보실수 있을거라 생각됩니다.
그리고 get_list()함수내에서는 global $site_view해서 사용해야 할듯하구요;;
오랜만에 사용해서 제가 잘못 이해하고 있는지는 모르겠지만.. 음...

$row = sql_fetch(" select * from $write_table where wr_id = '$arr_notice[$k]' ");
$list[$i] = get_list($row, $board, $board_skin_path, $board[bo_subject_len]);
머 이렇게 사용된다믄 list.php 파일 상단에
$sideview = array(); 를주고
function get_list(){
   global $sideview;

  if($sideview[$list['mb_id']][name])
       $list['name'] = $sideview[$list[mb_id]][name];
  else {
       $list['name'] = get_sideview();
       $sideview[$list[mb_id]][name] = $list[name];
  }
이런식이 되야하지 않을까 합니당..;
}

불당 2008-09
현재는 해당페이지 내에서만 개선이 되고 있어요. 
한 페이지에 몇번씩 글을 올리는 경우에 유용하지만, 그 이외의 경우에는 개선이 필요하죠.
한번 읽어들인 sideview 정보를 계속해서 글로벌로 공유하려면 어떤 방법이 있을까요????
눈까리 2008-09

음.. sideview는 거의 모든?페이지에서 사용이 되므로
head.sub.php 나 common.lib.php 의 제일 상단부분이나, common.php파일의 $g4=array(); 부분? 몇라인인지는 기억 못하겠지만 그 아래 넣어줘도 되고..셋중 아무곳에다 넣으면 해결될듯 합니다만 ^^; 저는 꼭 필요한 페이지에서만 $sideview=array();를 주고 싶지만
정작 필요한 페이지는 관리자페이지의 회원관리 부분? 영카트가 있다면 주문쪽.
게시판 리스트, 글읽기의 코멘트부분 이렇게 3-4군데 정도에서 사용될건데~ 그 파일마다 찾아서 $sideview=array();를 주는게 귀찮다면 ㅋㅋ 역시 위 명시한 세개의 파일중 하나에 넣어주면 땡이겟죵 ^^;

역시 여기서도 중요한건 $sideview=array();는 따로 명시해주고 get_list()함수에서는
global $sideview; 해서 사용하는게 옳지요~ ^^

불당 2008-09
common.lib.php에 $sideview를 정의하고 get_list에서 global로 불러서 쓰게 수정했습니다. 추가적인 속도개선의 효과(?)는 아직까지 체감되지는 않네요. 코드 리뷰 부탁드립니다.

if (!isset($sideview))
    $sideview = array();

...
    $global $sideview;
...

    $tmp_name = get_text(cut_str($list['wr_name'], $config['cf_cut_name'])); // 설정된 자리수 만큼만 이름 출력
    $tmp_mb_id = $list['mb_id'];
    if ($board['bo_use_sideview'])
        if ($sideview[$tmp_mb_id]) { // 한번 불러온 정보가 있으면 그것을 사용
            $list['name'] = $sideview[$tmp_mb_id];
        } else {
            $list['name'] = get_sideview($list['mb_id'], $tmp_name, $list['wr_email'], $list['wr_homepage']);
            $sideview[$tmp_mb_id] = $list['name']; // 한번 불러온 사용자 정보를 임시저장
        }
    else
        $list['name'] = "<span class='".($list['mb_id']?'member':'guest')."'>$tmp_name</span>";
     
불당 2008-09
$tmp_mb_id를 추가정의해서 쓰는 이유는 $sideview['{$list[mb_id]}'] 와 같이 변수를 쓰니 보기도 복잡하고, 오동작을 해서 입니다.


제목Page 1/4
2016-08   47658   불당
2011-01   16668   불당
2008-04   15238   불당
2008-09   7674   불당
2013-01   15895   불당
2013-06   13073   불당
2008-04   7596   불당
2008-04   8245   불당
2008-04   7179   불당
2008-04   7577   불당
2008-04   5820   불당
2008-04   7930   불당
2008-04   7224   불당
2008-04   7939   불당
2008-04   15238   불당
2008-04   8674   불당
2008-04   6014   불당
2008-04   6332   불당
2008-04   8011   불당
2008-04   8067   불당
2008-04   7220   불당
2008-04   6911   불당
2008-05   5971   불당