기존의 캐쉬를 이용한 작업의 흐름은 다음과 같습니다.
1) PHP 페이지 호출
2) 부트스트랩 코드 수행
3) 파라미터를 분석한 다음에 캐쉬를 뒤져서
4) 캐쉬가 히트하면 해당 데이터를 가져다
5) 그대로 보내주던가 아니면 렌더링해서 보내준다
이런 흐름이었습니다. 사실 캐쉬를 쓴다고 해도 전체적인 처리에서
개선되는 것은 3번뿐으로 DB 쿼리에 비해 캐쉬를 뒤지는게 상대적으로
빠른 그 차이만큼의 시간이 절약될뿐 그 이외에는 처리시간을
크게 줄이지 못했습니다.
제가 만든 캐쉬 시스템은 이렇게 동작합니다.
1) HTML 페이지 호출
파라미터는 HTML 파일이름의 일부로 들어가 있어야 한다.
예를 들면 a라는 게시판의 2번째 페이지를 요청하는 경우 board_a_page_2.html 이라는 파일이름
2) 만약 파일이 있으면 그대로 보내준다 (static 파일로서 처리, PHP가 아예 실행되지 않음)
3) HTML 페이지가 없으면 404 핸들러로 등록한 generator PHP 코드로 리다이렉트
4) PHP가 실행되서 HTML페이지를 만들어낸다.
5) 만들어낸 HTML 페이지를 보낸다
이런 식으로 동작합니다.
아파치에게 맡겨서 static 파일로 처리함으로써 서버부담을 줄이는 것입니다.
속도면에서는 정말 좋은 방법이라고 생각하지만 실제 해보면 문제가 꽤 많습니다.
일단 캐쉬된 HTML 파일을 expire 시키는 문제입니다.
게시판에 write/update/delete 동작이 일어날때 영향을 받는 캐쉬된 HTML 파일들도
같이 일일이 지워버리는 식으로 꼼꼼히 작업해줘야 합니다.
둘째는 사용자 별로 화면이 달라지는 문제인데 이 부분은
화면을 부분적으로 로드하는걸로 해결하고 있습니다.
저는 원페이지 앱 스타일로 작업하고 있지만 pjax 스타일로 해도 괜찮을 것 같습니다.
셋째는 보안 문제입니다. HTML로 되어 있다보니 접근을 제한하는게 어렵습니다.
이 부분은 고민중인데 HTTP Basic 인증을 쓰는 것 말고는 별로 방법이 없을 것 같습니다만
일단 베이직 인증 자체를 저도 잘 몰라서 어떻게 연동해야 할지도 모르겠고
가능하다고 쳐도 꽤 복잡해질 것 같아서..
보안 문제가 없는 public한 페이지에만 적용하는게 한계인가.. 생각하고 있습니다.
마지막으로 고민하는게 하나의 파일에 대해 동시에 요청이 들어왔을때의 처리입니다.
하나의 PHP에서만 HTML을 만들고 다른 PHP에선 기다리게 해야할 것 같은데..
뭘 플래그로 삼을지..
게다가 일단 HTML을 create하고 나서 write가 완료되기 전에 그 HTML을 get하는
요청이 들어오면 완전히 써지지 않은 불완전한 HTML이 나갈 것 같은데 그것도 걱정이군요.