하나의 사이트를 여러개의 도메인으로 접근할 때 캐시 문제
AS 시절에 올렸던 팁인데, APMS로 개편되면서 게시물이 정리되었네요.
오늘 질문글이 있어서 다시 올려봅니다.
다음의 조건일 때 문제를 해결할 수 있습니다.
1. 하나의 사이트를 여러개의 도메인으로 접근하는 경우
2. 위젯 캐시기능을 이용하는 경우(그 외에도 apms_cache 함수를 사용할 경우)
위 상황에서 위젯이 캐시될 때 도메인 주소를 포함하여 저장되기 때문에,
다른 도메인으로 접속했을 때, 캐시된 도메인의 링크로 이동이 되고, 로그인도 풀리게 됩니다.
이 문제는 캐시할 때 도메인 정보까지 같이 저장하는 방식으로 해결할 수 있습니다.
우선 캐시 테이블에 도메인용 필드를 추가하기 위해 아래 쿼리를 실행합니다.
ALTER TABLE `g5_apms_cache`
ADD COLUMN `c_domain` VARCHAR(255) NOT NULL AFTER `c_id`,
DROP INDEX `c_name`,
ADD UNIQUE INDEX `cache_index` (`c_domain`, `c_name`);
그리고 /lib/apms.lib.php 파일에서 캐시 함수를 수정합니다.(623라인 부근)
---- 여기부터 ----
// 불당님의 db_cache 함수 그대로 차용 - 파일캐쉬를 DB로 대신하는 것, $c_code = "latest(simple, gnu4_pack)"
function apms_cache($c_name, $seconds=300, $c_code) {
global $g5;
$result = sql_fetch(" select c_name, c_text, c_datetime from {$g5['apms_cache']} where c_name = '$c_name' ", false);
if (!$result) {
// 시간을 offset 해서 입력 (-1을 해줘야 처음 call에 캐쉬를 만듭니다)
$new_time = date("Y-m-d H:i:s", G5_SERVER_TIME - $seconds - 1);
$result['c_datetime'] = $new_time;
sql_query(" insert into {$g5['apms_cache']} set c_name='$c_name', c_datetime='$new_time' ", false);
}
---- 여기까지 ----
위 부분을 아래와 같이 수정합니다.
---- 여기부터 ----
// 불당님의 db_cache 함수 그대로 차용 - 파일캐쉬를 DB로 대신하는 것, $c_code = "latest(simple, gnu4_pack)"
function apms_cache($c_name, $seconds=300, $c_code) {
global $g5;
$c_domain = $_SERVER['HTTP_HOST'];
$result = sql_fetch(" select c_name, c_text, c_datetime from {$g5['apms_cache']} where c_domain='$c_domain' and c_name = '$c_name' ", false);
if (!$result) {
// 시간을 offset 해서 입력 (-1을 해줘야 처음 call에 캐쉬를 만듭니다)
$new_time = date("Y-m-d H:i:s", G5_SERVER_TIME - $seconds - 1);
$result['c_datetime'] = $new_time;
sql_query(" insert into {$g5['apms_cache']} set c_domain='$c_domain', c_name='$c_name', c_datetime='$new_time' ", false);
}
---- 여기까지 ----
그리고 680라인 부근의 아래부분도 수정합니다.
---- 여기부터 ----
// 새로운 캐쉬값을 업데이트 하고
sql_query(" update {$g5['apms_cache']} set c_text = '$c_text1', c_datetime='".G5_TIME_YMDHIS."' where c_name = '$c_name' ", false);
---- 여기까지 ----
아래와 같이 수정합니다.
---- 여기부터 ----
// 새로운 캐쉬값을 업데이트 하고
sql_query(" update {$g5['apms_cache']} set c_text = '$c_text1', c_datetime='".G5_TIME_YMDHIS."' where c_domain='$c_domain' and c_name = '$c_name' ", false);
---- 여기까지 ----
이렇게 하시면 도메인별로 캐시를 별도로 하기 때문에 이 문제를 해결하실 수 있습니다.