RX/XE 팁
XE FAQ 는 제가 XE공홈 '묻고 답하기'에 답변한 내용들 중 일부를 정리한 내용입니다. (대부분이 제가 한 답변이죠)
XE Tips 는 제가 XE 공홈에 쓴 XE 관련 유용한 팁들입니다. 기능개선은 공홈에 안 적어둔 XE 유용 개선팁들입니다.
유용정보는 외부 검색을 통해 알아낸 소스등을 기재해둔 곳입니다.
버그 신고내역들은 XE 사용하다가 발견한 버그 패치방법들로, Core Issue 에 기록해뒀기에 XE 에 적용이 되었을 가능성이 있겠죠

제가 쓴 글들에 대해 퍼가실때는 꼭 출처를남겨주시고.. (다만 플래시뷰 기반이기에 퍼가기는조금 힘들 수 있겠죠 ^^;)
타회원의 글들도 적혀있는 출처를 같이 꼭 기재해주세요
출처 sejin7940 

1. 댓글 출력수가 너무 많을 경우 과부하가 걸려 사이트가 안 뜨는 현상

 

댓글수를 많이 출력시게 설정을 사용하시면, 아래 수정법대로 cach 처리하면 속도가 조금 더 계선될겁니다.
특히 대댓글접기 기능을 사용할 경우 이 현상이 발생할 수도 있겠네요
손님이나 최고관리자의 경우는 전혀 발생하지 않는 현상인데..
일반 로그인한 회원의 경우에는 이 현상이 발생해서,  회원제 사이트라면 꼭 처리를 해주는게 좋을듯하다.

 

이건 Core 자체에서 문제로 예상하지 못한 현상입니다.

댓글 하나를 확인할때마다  $oDocument->isEnableComment  라는 함수가 실행되는데  ( 해당 댓글 작성/수정 권한이 있는지 확인하는 함수입니다 )
그 내부에서 module 모듈에 있는 getGrant 라는 함수를 통해 게시판자체의 권한설정을 확인합니다
단, 손님이나 최고관리자는 그 전에 권한확인이 되기에 이 getGrant 라는 함수를 통하지 않기에... 회원에게만 문제가 발생하게 된겁니다.

grant 함수는 XE Core 에서 cach 처리를 안 하다보니,  항상 그때그때 다시 불러와 권한확인함수를 실행시키게 됩니다


보통은 댓글숫자가 보통은 20개~50개만 확인하기에 크게 문제가 안 되는데,  이 사이트의 해당 글의 경우 대댓글이 많은 경우 한번에 1000개 정도 되더군요 
cach 처리를 안 하니 500개 정도가 한계네요. 그 이상은 서버에서 못 버티네요

 

결국 Core 를 고쳐서...  getGrant 함수에 cach 처리를 해서..  이 부하를 확 줄였습니다
이제 정상적으로 전부 노출이 되네요

 

 

modules/module/module.model.php 에서

 

getGrant 함수를 통째로 교체하거나,  sejin7940 표시된 수정부분들을 추가하시면 됩니다.

 

/**
 * @brief Return permission by using module info, xml info and member info
 */
// sejin7940 수정 - cache 처리 - document.item 의 isGranted 에서 계속 getGrant 를 호출해서
function getGrant($module_info, $member_info, $xml_info = '')
{
    $grant = new stdClass();

    // sejin7940 (시작)
    $oCacheHandler = CacheHandler::getInstance('object', null, true);
    if($oCacheHandler->isSupport())
    {
        $object_key = 'module_grant:'.$module_info->module_srl."_".$member_info->member_srl;
        $cache_key = $oCacheHandler->getGroupKey('site_and_module', $object_key);
        $grant = $oCacheHandler->get($cache_key);
    }

    if($grant === false) {

   // sejin7940 (끝)
        if(!$xml_info)
        {
            $module = $module_info->module;
            $xml_info = $this->getModuleActionXml($module);
        }
        // Set variables to grant group permission
        $module_srl = $module_info->module_srl;
        $grant_info = $xml_info->grant;
        if($member_info->member_srl)
        {
            if(is_array($member_info->group_list)) $group_list = array_keys($member_info->group_list);
            else $group_list = array();
        }
        else
        {
            $group_list = array();
        }
        // If module_srl doesn't exist(if unable to set permissions)
        if(!$module_srl)
        {
            $grant->access = true;
            if($this->isSiteAdmin($member_info, $module_info->site_srl))
            {
                $grant->access = $grant->manager = $grant->is_site_admin = true;
            }

            $grant->is_admin = $grant->manager = ($member_info->is_admin == 'Y') ? true : false;
        }
        else
        {
            // If module_srl exists
            // Get a type of granted permission
            $grant->access = $grant->manager = $grant->is_site_admin = ($member_info->is_admin=='Y'||$this->isSiteAdmin($member_info, $module_info->site_srl))?true:false;
            $grant->is_admin = ($member_info->is_admin == 'Y') ? true : false;
            // If a just logged-in member is, check if the member is a module administrator
            if(!$grant->manager && $member_info->member_srl)
            {
                $args = new stdClass();
                $args->module_srl = $module_srl;
                $args->member_srl = $member_info->member_srl;
                $output = executeQuery('module.getModuleAdmin',$args);
                if($output->data && $output->data->member_srl == $member_info->member_srl) $grant->manager = true;
            }
            // If not an administrator, get information from the DB and grant manager privilege.
            if(!$grant->manager)
            {
                $args = new stdClass();
                // If planet, get permission settings from the planet home
                if($module_info->module == 'planet')
                {
                    $output = executeQueryArray('module.getPlanetGrants', $args);
                }
                else
                {
                    $args = new stdClass;
                    $args->module_srl = $module_srl;
                    $output = executeQueryArray('module.getModuleGrants', $args);
                }

                $grant_exists = $granted = array();

                if($output->data)
                {
                    // Arrange names and groups who has privileges
                    foreach($output->data as $val)
                    {
                        $grant_exists[$val->name] = true;
                        if($granted[$val->name]) continue;
                        // Log-in member only
                        if($val->group_srl == -1)
                        {
                            $granted[$val->name] = true;
                            if($member_info->member_srl) $grant->{$val->name} = true;
                            // Site-joined member only
                        }
                        elseif($val->group_srl == -2)
                        {
                            $granted[$val->name] = true;
                            // Do not grant any permission for non-logged member
                            if(!$member_info->member_srl) $grant->{$val->name} = false;
                            // Log-in member
                            else
                            {
                                $site_module_info = Context::get('site_module_info');
                                // Permission granted if no information of the currently connected site exists
                                if(!$site_module_info->site_srl) $grant->{$val->name} = true;
                                // Permission is not granted if information of the currently connected site exists
                                elseif(count($group_list)) $grant->{$val->name} = true;
                            }
                            // All of non-logged members
                        }
                        elseif($val->group_srl == 0)
                        {
                            $granted[$val->name] = true;
                            $grant->{$val->name} = true;
                            // If a target is a group
                        }
                        else
                        {
                            if($group_list && count($group_list) && in_array($val->group_srl, $group_list))
                            {
                                $grant->{$val->name} = true;
                                $granted[$val->name] = true;
                            }
                        }
                    }
                }
                // Separate processing for the virtual group access
                if(!$grant_exists['access']) $grant->access = true;
                if(count($grant_info))
                {
                    foreach($grant_info as  $grant_name => $grant_item)
                    {
                        if($grant_exists[$grant_name]) continue;
                        switch($grant_item->default)
                        {
                            case 'guest' :
                                $grant->{$grant_name} = true;
                                break;
                            case 'member' :
                                if($member_info->member_srl) $grant->{$grant_name} = true;
                                else $grant->{$grant_name} = false;
                                break;
                            case 'site' :
                                $site_module_info = Context::get('site_module_info');
                                if($member_info->member_srl && (($site_module_info->site_srl && count($group_list)) || !$site_module_info->site_srl)) $grant->{$grant_name} = true;
                                else $grant->{$grant_name} = false;
                                break;
                            case 'manager' :
                            case 'root' :
                                if($member_info->is_admin == 'Y') $grant->{$grant_name} = true;
                                else $grant->{$grant_name} = false;
                                break;
                        }
                    }
                }
            }
            // Set true to grant all privileges if an administrator is
            if($grant->manager)
            {
                $grant->access = true;
                if(count($grant_info))
                {
                    foreach($grant_info as $key => $val)
                    {
                        $grant->{$key} = true;
                    }
                }
            }
        }
    // sejin7940 (시작)
        if($oCacheHandler->isSupport()) $oCacheHandler->put($cache_key, $grant);
    }

    // sejin7940 (끝)
    return $grant;
}

전체 695건
번호 카테고리 제목 출처 등록일 조회
공지 XE 기능개선 XE 1.11.18 이후 버전의 익명 수정 버그 수정법 xetown  2023.10.07 3213
공지 XE 기능개선 XE 1.11.14 보안패치 - 타인의 쪽지 내용을 확인할 수 있는 버그 패치방법 xetown  2023.10.03 3274
공지 XE 기능개선 XE 1.11.6 이후 보안배치 #4 file rhymix  2022.07.05 3444
공지 1.11.6 XE 1.11.6 이후 보안배치 #3 rhymix  2022.04.02 3395
공지 1.11.6 XE 1.11.6 이후 보안배치 #1 xetown  2021.06.22 3785
공지 1.11.6 XE 1.11.6 이하 에서 공개댓글을 비밀댓글로 변경시 생길 수 있는 오류 수정법 sejin7940  2021.01.10 3709
공지 XE 기능개선 XE 1.11.4 이후에서 파일 업로드시 정상 작동 안 하는 현상 수정법 XE github  2019.04.02 6466
공지 XE 기능개선 php 7.1 환경에서 XE 오류 나는 경우 확인할 사항 sejin7940  2018.07.11 6386
공지 유용정보 php7.2 환경에서 XE 오류가 생기는 경우 - Object 클래스 변경 필요 XE Github  2017.11.27 9963
공지 XE 기능개선 XE 1.8.30 이하에서 반드시 수정해주셔야하는 부분입니다. XE 1.8.31  2017.02.26 7170
공지 1.8.18 XE 1.8.18 에서 사용시 반드시 수정해야할 사항들 ( XE 1.8.20 이후에서는 수정 불필요 ) xetown  2016.04.03 26294
공지 XE 기능개선 XE 1.8.12 이후부터 proc controller 일부가 작동 안 할 경우 확인할 부분 [1] XE  2015.10.16 26205
335 1.8.18 SEO 1.8.18 에서 Analytics 와 기타 탭 작동 안 하는 버그 수정법 sejin7940  2016.04.03 943
334 XE 기능개선 스케치북 모바일에서 CkEditor 뜨는 오류해결 및 Ckeditor 로 아예 모바일에디터 기반 바꾸는 방법 xetown  2016.04.03 1654
333 다른 XE자료들 스케치북 모바일 스킨에서 출력되지 않는 버튼들 출력되도록 sejin7940  2016.04.19 957
332 다른 XE자료들 reCAPTCHA 2.0 애드온 에서 취소 클릭시 재등록시 캡쳐문구가 안 나오는 버그 수정법 sejin7940  2016.04.26 1096
331 XE 기능개선 댓글 등록될때는 최근수정일 정보가 변경되질 않도록 수정 sejin7940  2016.04.30 1381
330 유용정보 html 태그에 사용자가 값을 정의할 수 있는 'data-XXX' 속성 pjh445  2016.05.01 1076
329 유용정보 IE8이나 IE9 에서 selectbox 내부에 한글이 안 보이는 경우 sejin7940  2016.05.04 1095
328 XE FAQ 파일첨부에서 exe 파일이나 html, php 파일들을 업로드하면, 파일명이 -x 형태로 되는 현상이 있는데 -x 가 안 달리게 하려면.. sejin7940  2016.05.12 1252
327 유용정보 box-sizing 속성 - 길이에 테두리 값을 포함할지 여부 캔유미  2016.05.12 1052
326 XE 기능개선 회원그룹설정에 그룹번호가 보이게 하는 방법   2016.05.12 1003
325 다른 XE자료들 누리고 MessageXE II 문자메시지 모듈에서, 예약문자 취소 안 되는 버그 sejin7940  2016.05.13 1182
324 XE 기능개선 ckeditor 에서 한글폰트 추가하는 방법 sejin7940  2016.05.19 3864
323 유용정보 Google Maps API를 이용하여 주소 <-> 좌표(위도/경도) 참고 소스 나까마웹제작  2016.05.23 1215
322 XE FAQ 사용자정의 기준으로 정렬을 했을 경우 최신글이 목록 상단으로 뜨도록 수정법 ( 현재 최신글이 하단에 뜸 ) sejin7940  2016.05.24 880
321 XE 기능개선 캡챠(captcha) 의 글자수를 늘려 더 복잡하게 하거나, 줄여서 간단하게 하고픈 경우 sejin7940  2016.05.25 1348
320 유용정보 bootstrap3 기반에서 slide 형태에서 swipe 기능 사용 방법 laz  2016.06.02 1536
» XE 기능개선 댓글 출력수가 너무 많을 경우 과부하가 걸려 사이트가 안 뜨는 현상 [4] sejin7940  2016.06.12 1379
318 XE 기능개선 통합검색이 안 되는 현상 발생할 경우, 수정법 및 Core 보완법 sejin7940  2016.06.12 1420
317 XE 기능개선 닉네임 클릭시 회원정보 등 회원메뉴 관리자에게만 보이게 / 또는 회원에게만 보이게 sejin7940  2016.06.28 280
316 XE 기능개선 웹에서 엑셀다운로드한 파일이 MS Excel 2016 (엑셀2016) 에서 열리지 않는 경우 해결법 sejin7940  2016.07.20 1012
XE Login