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;
}

전체 704건
번호 카테고리 제목 출처 등록일 조회
공지 XE 기능개선 XE 1.11.18 이후 버전의 익명 수정 버그 수정법 xetown  2023.10.07 4897
공지 XE 기능개선 XE 1.11.14 보안패치 - 타인의 쪽지 내용을 확인할 수 있는 버그 패치방법 xetown  2023.10.03 4950
공지 XE 기능개선 XE 1.11.6 이후 보안배치 #4 file rhymix  2022.07.05 5098
공지 1.11.6 XE 1.11.6 이후 보안배치 #3 rhymix  2022.04.02 5095
공지 1.11.6 XE 1.11.6 이후 보안배치 #1 xetown  2021.06.22 5481
공지 1.11.6 XE 1.11.6 이하 에서 공개댓글을 비밀댓글로 변경시 생길 수 있는 오류 수정법 sejin7940  2021.01.10 5375
공지 XE 기능개선 XE 1.11.4 이후에서 파일 업로드시 정상 작동 안 하는 현상 수정법 XE github  2019.04.02 8388
공지 XE 기능개선 php 7.1 환경에서 XE 오류 나는 경우 확인할 사항 sejin7940  2018.07.11 8294
공지 유용정보 php7.2 환경에서 XE 오류가 생기는 경우 - Object 클래스 변경 필요 XE Github  2017.11.27 12103
공지 XE 기능개선 XE 1.8.30 이하에서 반드시 수정해주셔야하는 부분입니다. XE 1.8.31  2017.02.26 8928
공지 1.8.18 XE 1.8.18 에서 사용시 반드시 수정해야할 사항들 ( XE 1.8.20 이후에서는 수정 불필요 ) xetown  2016.04.03 28211
공지 XE 기능개선 XE 1.8.12 이후부터 proc controller 일부가 작동 안 할 경우 확인할 부분 [1] XE  2015.10.16 27981
383 XE 기능개선 닉네임 클릭시 회원정보 등 회원메뉴 관리자에게만 보이게 / 또는 회원에게만 보이게 sejin7940  2016.06.28 319
382 XE 기능개선 통합검색이 안 되는 현상 발생할 경우, 수정법 및 Core 보완법 sejin7940  2016.06.12 1465
» XE 기능개선 댓글 출력수가 너무 많을 경우 과부하가 걸려 사이트가 안 뜨는 현상 [4] sejin7940  2016.06.12 1447
380 유용정보 bootstrap3 기반에서 slide 형태에서 swipe 기능 사용 방법 laz  2016.06.02 1805
379 XE 기능개선 캡챠(captcha) 의 글자수를 늘려 더 복잡하게 하거나, 줄여서 간단하게 하고픈 경우 sejin7940  2016.05.25 1389
378 XE FAQ 사용자정의 기준으로 정렬을 했을 경우 최신글이 목록 상단으로 뜨도록 수정법 ( 현재 최신글이 하단에 뜸 ) sejin7940  2016.05.24 926
377 유용정보 Google Maps API를 이용하여 주소 <-> 좌표(위도/경도) 참고 소스 나까마웹제작  2016.05.23 1258
376 XE 기능개선 ckeditor 에서 한글폰트 추가하는 방법 sejin7940  2016.05.19 4033
375 다른 XE자료들 누리고 MessageXE II 문자메시지 모듈에서, 예약문자 취소 안 되는 버그 sejin7940  2016.05.13 1227
374 XE 기능개선 회원그룹설정에 그룹번호가 보이게 하는 방법   2016.05.12 1036
373 유용정보 box-sizing 속성 - 길이에 테두리 값을 포함할지 여부 캔유미  2016.05.12 1103
372 XE FAQ 파일첨부에서 exe 파일이나 html, php 파일들을 업로드하면, 파일명이 -x 형태로 되는 현상이 있는데 -x 가 안 달리게 하려면.. sejin7940  2016.05.12 1292
371 유용정보 IE8이나 IE9 에서 selectbox 내부에 한글이 안 보이는 경우 sejin7940  2016.05.04 1136
370 유용정보 html 태그에 사용자가 값을 정의할 수 있는 'data-XXX' 속성 pjh445  2016.05.01 1105
369 XE 기능개선 댓글 등록될때는 최근수정일 정보가 변경되질 않도록 수정 sejin7940  2016.04.30 1423
368 다른 XE자료들 reCAPTCHA 2.0 애드온 에서 취소 클릭시 재등록시 캡쳐문구가 안 나오는 버그 수정법 sejin7940  2016.04.26 1133
367 다른 XE자료들 스케치북 모바일 스킨에서 출력되지 않는 버튼들 출력되도록 sejin7940  2016.04.19 997
366 XE 기능개선 스케치북 모바일에서 CkEditor 뜨는 오류해결 및 Ckeditor 로 아예 모바일에디터 기반 바꾸는 방법 xetown  2016.04.03 1704
365 1.8.18 SEO 1.8.18 에서 Analytics 와 기타 탭 작동 안 하는 버그 수정법 sejin7940  2016.04.03 993
XE Login