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;
}
댓글 4
-
라자루스
2016.06.19 22:46
-
sejin7940
2016.06.21 21:31
아.. 그럴 수가 있겠군요.
그룹변동 하는 함수 쪽에서, 그룹이 변동될때 관련 캐시를 한번 재생성하시는게 좋겠군요
( 제가 관련 기능 만든 사이트에서는 그럴 일이 없는 사이트여서.. ^^)
추후에는 관련 사항도 검토를 해야겠군요
-
라자루스
2016.06.23 17:20
좀 불편하긴 하지만 그래도 필수로 하는 게 좋을 것 같아 일단은 적용시켰습니다. 팁 올려주신 것 감사드려요.
-
호롤롤롤
2017.08.25 14:43
안녕하세요. 세진님 이 팁을 이용해서 문제를 해결했는데 처음 댓글을 달아주신분 말씀처럼 그룹별 포인트에 변동을 줘도 사이트에 바로 반영이 되지 않습니다. 관리자 페이지 포인트목록에서는 포인트가 초기화된 것으로 나오는데 각 회원정보 페이지에는 이전 포인트가 그대로 나오는 상태입니다. 관리자페이지에서 캐시파일 재생성을해도 반영이 안되는데 어떻게 하면 될까요? 포인트 관련해서 따로 캐시파일을 재생성하려면 어떻게 해아 하나요? 초보적인 질문 죄송합니다ㅠㅠ
이 팁을 적용할시 포인트 모듈에서 그룹을 연동시켰을 때 권한이 바로 반영되지 않는 문제가 있는 듯합니다.