ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Rb의 동작원리, index.php 분석
    웹개발 (킴스큐Rb) 2011. 8. 4. 18:11
    세줄요약
    • 모든 URL 요청은 index.php로 처리 된다. (즉, 화면에 보이는 건 항상 index.php)
    • 다른 걸 보여주려면 index.php/?m=bbs 등으로 다른 변수를 넘긴다. (m: 모듈, c: 메뉴, mod: 페이지, r: 사이트)
    • 평소 주소에서 index.php는 ? 앞에서 생략 된다. (예: http://www.mydomain.com/rb/?m=bbs)

    아, 내용이 방대해서 세 줄로 요약하는데 어려웠으나 요약결과에 만족한다.

    킴스큐Rb 홈페이지 개발자가이드에 주석이 달린 index.php를 다운로드 할 수 있으니 다운로드 후 열어서 살펴 보자.
    최신 버전은 아니지만 별 차이는 없다.

    index.php 코드를 정리하자면 다음과 같다.

    1. 전처리. 당연히 화면에는 보이지 않는다. (관리자 모드인지? 올바른 페이지 요청인지? 사이트 언어 설정과 맞는지? 요청한 페이지가 메뉴인지? 어떤 모듈인지? 등등 확인 및 처리하며 이후 사용할 각종 경로도 설정, 로그인 상태면 DB에서 회원 정보도 읽어둠: 다운로드한 index.php의 주석 참조)

      <head>
    2. 전처리된 사이트 설정에 따라 레이아웃의 css, 모듈의 css를 include (삽입)
    3. 레이아웃과 모듈의 js를 include
    4. 사이트 설정($_HS) 헤더코드 삽입
      </head>

      <body>
    5. 관리자로 로그인 상태면 상단 관리 메뉴바를 출력
    6. 레이아웃 출력 (레이아웃 폴더의 main.php에서 화면의 보여질 주 내용(__KIMS_CONTENT__)을 출력)
    7. 팝업이 설정 되어 있으면 창 띄움
    8. 쪽지가 와 있으면 쪽지창 띄움
    9. 사이트 설정($_HS) 풋터코드 삽입
      </body>
       
    10. 방문 조회수 계산



    <head>태그 이후로는 주석이 없는데, 코드를 읽으면 된다지만 귀찮으니 우리가 붙여보자.

    <?php if($_HS['dtd']=='xhtml_1'):?>    // $_HS는 사이트 설정이 저장된 변수로 DTD 형식을 확인한다. (그게 뭔진 나도 잘 모르지만
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <html lang="<?php echo $lang['sys']['lang']?>" xml:lang="<?php echo $lang['sys']['lang']?>" xmlns="http://www.w3.org/1999/xhtml">    // Rb 설치 후 관리자로 로긴해서 홈페이지 모듈의 사이트 탭을 보면 'DTD 형식'이 있다.

    <?php else:?>    // 위에 까지가 XHTML 1.0 이면 최초 <html>태그를 저렇게 붙이는 부분

    <!DOCTYPE html>

    <html lang="<?php echo $lang['sys']['lang']?>">   // HTML5이면 짧게 언어만 설정한다.

    <?php endif?>

    <head>

    <meta http-equiv="content-type" content="text/html;charset=utf-8" />

    <meta name="generator" content="kimsQ-RB" />

    <?php if(!$_HS['headercode']):?>    // 헤더코드가 없으면 넣어준다. 관리자로긴 후 홈페이지 모듈의 사이트 탭을 보면 아래 '헤더/테일코드'

    <meta name="author" content="<?php echo $_SERVER['HTTP_HOST']?>" />    // 헤더코드가 있으면 저 아래 </head> 태그 전에 삽입

    <meta name="subject" content="<?php echo strip_tags($g['meta_sbj'])?>" />

    <meta name="title" content="<?php echo strip_tags($g['meta_tit'])?>" />

    <meta name="keywords" content="<?php echo strip_tags($g['meta_key'])?>" />

    <meta name="description" content="<?php echo strip_tags($g['meta_des'])?>" />

    <meta name="copyright" content="Copyrights © <?php echo $date['year']?> <?php echo $_SERVER['HTTP_HOST']?> All Rights Reserved" />

    <?php endif?>

    <?php if($g['mobile']&&$_SESSION['pcmode']!='Y'&&$_HS['m_layout']):?>    // 모바일 접속이면?

    <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no" /> 

    <?php endif?>

    <title><?php echo $g['browtitle']?></title>

    <?php if($m=='admin'):?>    // 요청된 모듈이 관리자 모듈(admin)이면?

    <link rel="shortcut icon" href="<?php echo $g['img_core']?>/_public/favicon.ico" type="image/x-icon" />

    <?php endif?>

    <link type="text/css" rel="stylesheet" charset="utf-8" href="<?php echo $g['s']?>/_core/css/sys.css" />    // 코어 css 삽입

    <link type="text/css" rel="stylesheet" charset="utf-8" href="<?php echo $g['url_layout']?>/_main.css" />    // 레이아웃의 css 삽입

    <?php if(is_file($d['layout']['pwd'].'.css')):?>    // 레이아웃 폴더명과 같은 이름의 css 파일 삽입 (bbs 폴더에 bbs.css가 있으면 삽입)

    <link type="text/css" rel="stylesheet" charset="utf-8" href="<?php echo $g['s']?>/layouts/<?php echo $d['layout']['str']?>.css" />

    <?php endif?>

    <?php if(is_file($g['dir_module'].'_main.css')):?>    // 현재 요청된 모듈 폴더(경로)의 css 삽입

    <link type="text/css" rel="stylesheet" charset="utf-8" href="<?php echo $g['url_module']?>/_main.css" />

    <?php endif?>

    <?php if(is_file($g['dir_module_skin'].'_main.css')):?>    // 요청된 모듈의 테마(스킨) 폴더의 css 삽입

    <link type="text/css" rel="stylesheet" charset="utf-8" href="<?php echo $g['url_module_skin']?>/_main.css" />

    <?php endif?>

    <?php if(is_file($g['dir_module_mode'].'.css')):?>    // 요청된 모듈의 폴더명과 같은 이름의 css 파일 삽입

    <link type="text/css" rel="stylesheet" charset="utf-8" href="<?php echo $g['url_module_mode']?>.css" />

    <?php endif?>

    <?php if(is_file($g['dir_module_admin'].'.css')):?>    // 요청된 모듈의 관리자 모드의 폴더명과 같은 이름의 css 파일 삽입

    <link type="text/css" rel="stylesheet" charset="utf-8" href="<?php echo $g['url_module_admin']?>.css" />

    <?php endif?>

    <script type="text/javascript">    // 자바스크립트 변수에 php 변수를 복사

    //<![CDATA[

    var mbrclick= false;

    var rooturl = '<?php echo $g['url_root']?>';

    var raccount= '<?php echo $r?>';

    var moduleid= '<?php echo $m?>';

    var memberid= '<?php echo $my['id']?>';

    var is_admin= '<?php echo $my['admin']?>';

    var needlog = '<?php echo $lang['sys']['need_login']?>';

    var neednum = '<?php echo $lang['sys']['need_num']?>';

    var myagent = navigator.appName.indexOf('Explorer') != -1 ? 'ie' : 'ns';

    //]]>

    </script>

    <script type="text/javascript" charset="utf-8" src="<?php echo $g['s']?>/_core/js/sys.js"></script>    // 코어 js 삽입

    <script type="text/javascript" charset="utf-8" src="<?php echo $g['url_layout']?>/_main.js"></script>    // 레이아웃의 js 삽입

    <?php if(is_file($d['layout']['pwd'].'.js')):?>    // 레이아웃 폴더명과 같은 이름의 js 파일 삽입 (bbs 폴더에 bbs.js가 있으면 삽입)

    <script type="text/javascript" charset="utf-8" src="<?php echo $g['s']?>/layouts/<?php echo $d['layout']['str']?>.js"></script>

    <?php endif?>

    <?php if(is_file($g['dir_module'].'_main.js')):?>    // 현재 요청된 모듈 폴더(경로)의 js 삽입

    <script type="text/javascript" charset="utf-8" src="<?php echo $g['url_module']?>/_main.js"></script>

    <?php endif?>

    <?php if(is_file($g['dir_module_skin'].'_main.js')):?>    // 요청된 모듈의 테마(스킨) 폴더의 js 삽입

    <script type="text/javascript" charset="utf-8" src="<?php echo $g['url_module_skin']?>/_main.js"></script>

    <?php endif?>

    <?php if(is_file($g['dir_module_mode'].'.js')):?>    // 요청된 모듈의 폴더명과 같은 이름의 js 파일 삽입

    <script type="text/javascript" charset="utf-8" src="<?php echo $g['url_module_mode']?>.js"></script>

    <?php endif?>

    <?php if(is_file($g['dir_module_admin'].'.js')):?>    // 요청된 모듈의 관리자 모드의 폴더명과 같은 이름의 js 파일 삽입

    <script type="text/javascript" charset="utf-8" src="<?php echo $g['url_module_admin']?>.js"></script>

    <?php endif?>

    <?php echo $_HS['headercode']?>

    </head>

    <body>

    <?php if($my['admin']&&!$iframe&&(!$g['mobile']||$_SESSION['pcmode']=='Y')):?>

    <?php include_once $g['path_var'].'language/'.$g['sys_selectlang'].'/_top.lang.php'?>

    <div id="adminControl">

    <div class="aleft">

    <ul>

    <li><a href="http://www.kimsq.com/" target="_blank"><img src="<?php echo $g['img_core']?>/_public/ico_rb.gif" class="rb" alt="RB" title="kimsQ-RB" /></a></li>

    <li><a href="<?php echo $g['s']?>/?r=<?php echo $r?>" class="b" title="<?php echo $_HS['name']?>">HOME</a></li>

    <li><a href="<?php echo RW('m=admin')?>" class="b">ADMIN</a> <a href="<?php echo $g['s']?>/?r=<?php echo $r?>&amp;m=admin&amp;type=editmode"><img src="<?php echo $g['img_core']?>/_public/btn_add_01.gif" alt="" title="<?php echo $lang['top']['desk']?>" class="deskedit" /></a></li>

    <li><a href="<?php echo $g['s']?>/?r=<?php echo $r?>&amp;system=edit.all&amp;type=site"><?php echo $lang['top']['site']?></a> <a href="<?php echo $g['s']?>/?r=<?php echo $r?>&amp;m=admin&amp;module=home&amp;type=makesite" title="<?php echo $lang['top']['newsite']?>"><img src="<?php echo $g['img_core']?>/_public/btn_add_01.gif" alt="" /></a></li>

    <li><a href="<?php echo $g['s']?>/?r=<?php echo $r?>&amp;system=edit.all&amp;type=menu"><?php echo $lang['top']['menu']?></a> <a href="<?php echo $g['s']?>/?r=<?php echo $r?>&amp;system=edit.all&amp;type=menu&amp;makemenu=Y" title="<?php echo $lang['top']['newmenu']?>"><img src="<?php echo $g['img_core']?>/_public/btn_add_01.gif" alt="" /></a></li>

    <li><a href="<?php echo $g['s']?>/?r=<?php echo $r?>&amp;system=edit.all&amp;type=page"><?php echo $lang['top']['page']?></a> <a href="<?php echo $g['s']?>/?r=<?php echo $r?>&amp;system=edit.all&amp;type=pageadd" title="<?php echo $lang['top']['newpage']?>"><img src="<?php echo $g['img_core']?>/_public/btn_add_01.gif" alt="" /></a></li>

    <?php if(!$system):?>

    <?php if($_HM['uid']):?>

    <li><a href="<?php echo $g['s']?>/?r=<?php echo $r?>&amp;system=edit.menu&amp;_menu=<?php echo $_HM['uid']?>" class="editpage" title="MENUKEY:<?php echo $_HM['uid']?>"><?php echo $lang['top']['edit']?></a> <a href="<?php echo $g['s']?>/?r=<?php echo $r?>&amp;system=edit.all&amp;type=menu&amp;cat=<?php echo $_HM['uid']?>" title="<?php echo $lang['top']['property']?>"><img src="<?php echo $g['img_core']?>/_public/btn_add_01.gif" alt="" /></a></li>

    <?php elseif($_HP['uid']):?>

    <li><a href="<?php echo $g['s']?>/?r=<?php echo $r?>&amp;system=edit.page&amp;_page=<?php echo $_HP['uid']?>" class="editpage"><?php echo $lang['top']['edit']?></a> <a href="<?php echo $g['s']?>/?r=<?php echo $r?>&amp;system=edit.all&amp;type=pageadd&amp;uid=<?php echo $_HP['uid']?>" title="<?php echo $lang['top']['property']?>"><img src="<?php echo $g['img_core']?>/_public/btn_add_01.gif" alt="" /></a></li>

    <?php endif?>

    <?php else:?>

    <li><?php echo $lang['top']['edit']?></li>

    <?php endif?>

    </ul>

    </div>

    <div class="aright">

    <img src="<?php echo $g['img_core']?>/_public/ico_user.gif" alt="" />

    <a href="<?php echo RW('mod=mypage')?>" class="admlink"><?php echo sprintf($lang['top']['admin'],$my[$_HS['nametype']])?></a>

    <span class="mbox">

    <a href="<?php echo $g['s']?>/?r=<?php echo $r?>&amp;m=admin&amp;module=member">Member</a> <span class="asplit">|</span> 

    <a href="<?php echo $g['s']?>/?r=<?php echo $r?>&amp;m=admin&amp;module=bbs">Board</a> <span class="asplit">|</span> 

    <a href="<?php echo $g['s']?>/?r=<?php echo $r?>&amp;m=admin&amp;module=layout">Layout</a>  <span class="asplit">|</span> 

    <a href="<?php echo $g['s']?>/?r=<?php echo $r?>&amp;m=admin&amp;module=market">Market</a>

    </span>

    <a href="<?php echo $g['s']?>/?r=<?php echo $r?>&amp;a=logout"><img src="<?php echo $g['img_core']?>/_public/btn_logout.gif" alt="logout" class="logout" /></a>

    </div>

    <div class="clear"></div>

    </div>

    <script type="text/javascript">

    //<![CDATA[

    document.body.style.backgroundPosition = 'left 23px';

    //]]>

    </script>

    <?php endif?>

    <?php include_once $g['path_layout'].$d['layout']['php']?>

    <?php if($g['mobile']&&$_SESSION['pcmode']=='Y'&&$iframe!='Y'):?>

    <div id="pctomobile"> 

    <a href="<?php echo $g['s']?>/?r=<?php echo $r?>&amp;a=mobilemode"><?php echo sprintf($lang['sys']['viewpcmode'],$m=='admin'?'관리자모드':'홈페이지')?></a>

    </div>

    <?php endif?>

    <div id="_action_layer_"></div>

    <iframe name="_action_frame_<?php echo $m?>" width="0" height="0" frameborder="0" scrolling="no"></iframe>

    <script type="text/javascript">

    //<![CDATA[

    <?php if($m!='admin'&&$iframe!='Y'&&!$g['mobile']):?>

    <?php $POPUPS = getDbSelect($table['s_popup'],'hidden=0','*')?>

    <?php while($POP=db_fetch_array($POPUPS)):?>

    <?php if (!$POP['term0'] && ($POP['term1'] > $date['totime'] || $POP['term2'] < $date['totime'])):?>

    <?php getDbUpdate($table['s_popup'],'hidden=1','uid='.$POP['uid']);continue?>

    <?php endif?>

    <?php $POP['xdispage']='_'.$POP['dispage']?>

    <?php if(strpos($POP['xdispage'],'[c['.$_HS['uid'].']]')) continue?>

    <?php if(!strpos($POP['xdispage'],'[s['.$_HS['uid'].']]') && !strpos($POP['xdispage'],'[m['.$_HS['uid'].']'.$_HM['id'].']') && !strpos($POP['xdispage'],'[m['.$_HS['uid'].']'.$_HP['id'].']')) continue?>

    if (getCookie('popview').indexOf('[<?php echo $POP['uid']?>]') == -1)

    {

    <?php if($POP['type']):?>

    frames._action_frame_<?php echo $m?>.location.href='<?php echo $g['s']?>/?r=<?php echo $r?>&system=popup.layer&uid=<?php echo $POP['uid']?>&iframe=Y';

    <?php else:?>

    window.open('<?php echo $g['s']?>/?r=<?php echo $r?>&system=popup.window&uid=<?php echo $POP['uid']?>&iframe=Y','popview_<?php echo $POP['uid']?>','left=<?php echo $POP['pleft']?>,top=<?php echo $POP['ptop']?>,width=<?php echo $POP['width']?>,height=<?php echo $POP['height']?>,scrollbars=<?php echo $POP['scroll']?'yes':'no'?>,status=yes');

    <?php endif?> 

    }

    <?php endwhile?>

    <?php if($my['is_paper']):?>

    OpenWindow('<?php echo $g['s']?>/?r=<?php echo $r?>&system=popup.paper&iframe=Y');

    <?php endif?>

    <?php endif?>

    document.body.onclick = closeMemberLayer;

    //]]>

    </script>

    <?php echo $_HS['footercode']?>

    </body>

    </html>

    <?php if ($m!='admin'&&$iframe!='Y'&&!$system) include_once $g['path_core'].'engine/counter.engine.php'?>

    <?php if ($g['buffer']) ob_end_flush()?>




    브라우저에 보이는 부분만 관심을 가져보자.
    결국 URL의 ? 뒤에 어떤 변수를 넣느냐에 따라서 모듈, 페이지, 메뉴 등이 화면에 보여지는데
    index.php가 해당 부분을 직접 출력하는 것이 아니라
    관리자가 해당 사이트를 위해(Rb에서는 다중 사이트 관리가 가능) 설정한 레이아웃의 main.php 파일이 다음과 같은 코드를 통해 화면에 보이는 내용을 부른다.

    ...
    <div id="container">

    <?php include __KIMS_CONTAINER_HEAD__?>

    <div class="snb">

    <?php foreach($d['layout']['show'] as $_pluginkey => $_pluginval):if(!$_pluginval)continue?>

    <?php include $g['path_layout'].$d['layout']['dir'].'/plugin/'.$_pluginkey.'.php'?>

    <div class="plugingap"></div>

    <?php endforeach?>


    </div>

    <div id="content">

    <?php include __KIMS_CONTENT__?>

    </div>

    <div class="clear"></div>

    </div>

    <?php include __KIMS_CONTAINER_FOOT__?>
    ... 


    위 코드는 기본 레이아웃(default)의 기본 출력 파일인 main.php의 아랫부분이다. 앞부분에는 메뉴를 불러오는 코드가 있다.
    __KIMS_CONTAINER_HEAD__, __KIMS_CONTENT__, __KIMS_CONTAINER_FOOT__ 등이 레이아웃 안에서 보여지는 내용이다.




    그 외 몇 가지 짚고 넘어가자면...


    ...

    $g = array();

    $d = array();

    이후부터 사용할 어레이(배열)를 만든다.
    $g, $d는 Rb홈페이지 개발자가이드에 설명이 있다. 여기

    하지만 안 봐도 대충 감이 오는 건, g는 글로벌...;
    그럼 d는? 모듈별 변수라고 한다. 현재 페이지에서 쓰이는 변수들이 저장된다.

    이 둘은 커스터마이징을 위해 쓰일 핵심 변수들이기 때문에 잘 알아둬야 한다.


    if(!get_magic_quotes_gpc())

    {
    ...

    }

    else {
    ...
    }

    저게 뭔지 여기 또는 저기를 클릭!
    본문의 주제에 벗어나므로 깊게 파지 않는다.
    자, 다음


    if (is_file($g['path_var'].'db.info.php'))    // DB에서 정보를 읽어서 $my, $_CA, $_HM, $_HP, $g 등등에 저장한다. 

    {                                                         // 개발자 가이드에 해당 변수들에 대한 간략한 설명이 있다.

    include_once $g['path_var'].'db.info.php'; ...

    }

    else

    {

    $m = 'admin';

    $mod = 'install';

    }

    왕초보 팁.
    include 하면 그 아래 코드에서는 include한 모든 파일의 변수와 함수를 사용할 수 있다.


    이후로는 <head>에서 레이아웃과 모듈 파일들을 include 하고
    <body> 태그가 그것들을 출력해주는 것 뿐이다.

    브라우저에 뜬 페이지의 소스보기를 하면 서버에서 처리된 PHP 코드 대신 include 된 파일과 서버의 처리 결과가 좌악~ 보인다.

    누가 그러던데... 분석이라고 쓰고 날림이라고 읽는다고...;;;
    부실한 내용에도 끝까지 읽어주신 분들께 감사!
Designed by Tistory.