REDIRECT 되는 페이지의 캐쉬 화일 문제 해결
- a 라는 페이지가 있고, b 라는 페이지가 a 로 redirect 되는 페이지이며, 현재 a 페이지의 캐쉬화일이 없을 경우, b 를 클릭하면 a 페이지가 출력되면서 상단에 "b 로부터 자동으로 이동" 되었다는 헤드라인이 표시된다. 그런데 이 헤드라인이 같이 캐쉬 화일에 저장되기 때문에, 그 이후부터는 a 를 직접 열람할 때도 상단에 여전히 헤드라인이 나타난다. 올바르지 않은 출력이 나타난다는 것은 주인장같은 공돌이들에게는 참을 수 없는 일..
- redirect 로 이동한 경우에는 캐쉬 화일을 갱신하지 않도록 수정했다.
- "아니 그러면, b 를 클릭할 때는 평생이 가도 a 를 캐쉬를 통해서는 볼 수 없게 된다는 말이 아니오?" 라고 반문할 수 있겠다. 그렇다. 하지만 걱정할 것 없다. 주인장이 워낙 훌륭하게 고쳤기 때문...이 아니라, 사실은 원래부터 그런 거였다. 즉, 더 나빠진 것은 아니라는 말이다. :-) b 페이지처럼 다른 페이지로 redirect 되는 페이지들은 죽었다 깨어나도 캐쉬 화일이 만들어지지 않는다. 캐쉬 화일 갱신 루틴을 만나기 전에 a 페이지로 이동해 버리기 때문이다. 이 때 a 페이지의 캐쉬화일이 존재한다 하더라도, 역시 죽었다 깨어나도 a 의 캐쉬화일을 사용할 수는 없다. 왜냐하면 b 의 캐쉬화일을 검사하는 루틴이 지나가 버린 (물론, 그 검사는 실패했겠지) 이후에는, 더 이상 캐쉬화일을 검사하는 루틴은 없기 때문이다. 따라서, 사용자가 b 를 클릭할 때는 UseCache 옵션에 관계없이 a 의 페이지 데이타를 매번 변환하여 출력하게 된다.
- 부작용: 알려진 것 없음
- 굳이 단점을 찾아본다면, a 페이지에 대한 cache miss 가 딱 한 번 더 발생한다는 것이다. a 의 캐쉬화일이 없는 상태에서, 사용자가 b, b, a, b, a 의 순으로 페이지를 열람했다고 한다면, 기존 코드에서는 첫번째 b 를 열람한 시점에서 a 의 캐쉬가 생성되고, 세번째와 다섯번째에 a 를 열람할 때는 그 캐쉬된 데이타를 볼 수 있다. (문제는 그 캐쉬 데이타가 올바르지 않다는 점이다. 즉 상단에 대문짝만하게 "b 로부터 이동했음" 이라고 나올 것이다. 설령 a, b, a 의 순으로 열람했다 하더라도, 첫번째 a 열람시에는 제대로 나오고 캐쉬도 제대로 생성이 되지만, 두번째 b 를 열람할 때 캐쉬가 갱신되기 때문에 세번째 이후에는 잘못된 출력이 나온다.)
- 아래 패치를 적용할 경우, b b a b a 의 경우, 캐쉬 데이타는 세 번째에 a 를 열람할 때가 되어야 생성된다. 즉 세번째 a 는 좀 느리게 출력된다. 하지만 다섯번째를 비롯해서 그 이후 a 페이지를 열람할 때는 제대로 된 캐쉬 화일을 사용할 수 있다.
- 서론이 매우 길었는데, 정작 수정할 부분은 너무도 간단하다.
sub BrowsePage {
...
return if ($showDiff || ($revision ne ''));
&UpdateHtmlCache($id, $fullHtml) if ($UseCache && ($oldId eq ''));
}
- 단 한 줄 고치는 것 가지고 이리도 길게 설명한 이유는, 지금까지 했던 패치들 중에 가장 적은 노력으로 아주 훌륭한 성과를 내는 것이 뿌듯해서인지도 모르겠다. 이해해달라. :-)
Notes
아! 예전에 소스 수정하면서 안건데, 혹시 DoBrowseRequest 함수가 아닌, BrowsePage함수(..가 맞나?; )를 수정해줘야 하는거 아닌가요? 전에 제가 수정하였던 소스는 그렇던데...
- 어머나 세상에.. ^^; 말씀하신 그대로입니다. 함수가 긴데 수정한 부분이 꽤 아래쪽이라.. 위로 올라가다가 함수이름을 건너뛰었나보네요. 고쳤습니다. 감사합니다~
위키위키분류