Ticket #455 (closed enhancement: fixed)

Opened 2 years ago

Last modified 15 months ago

pageCache 도입

Reported by: inureyes Owned by: inureyes
Priority: major Milestone: 1.7
Component: Components Version: 1.5
Keywords: cache,pagecache Cc: dev@…
Release:

Description

개요

  • 쿼리가 많이 발생하는 부분의 경우 하드 캐싱을 해 버립니다.
  • 모듈의 형태로 만들어지며, 플러그인에서도 범용으로 사용할 수 있게 합니다.
  • 2.0 예정이었는데 생각보다 빨리 완성되어서 1.5로 땡깁니다.

Change History

  Changed 2 years ago by inureyes

  • status changed from new to assigned
  • class pageCache 도입.
    • 임시 파일을 cache/pageCache/blogid/복잡다단 한 이름으로 저장합니다.
    • 호출에 따라 없으면 만들고 있으면 걍 불러와서 "기타 자세한 사항은 생략하고" 바로 dressing 해버립니다.
    • member function

o initialize()

+ 디렉토리 없으면 만듭니다.

o reset()

+ 클래스의 내부 값들을 리셋합니다.

o load()

+ name에 지정된 이름의 캐시 데이터가 있는지 찾아보고, 있으면 contents 에 저장합니다.

o create()

+ contents에 지정한 값을 name으로 지정한 캐시 데이터로 만듭니다.

o purge()

+ name에 지정된 이름의 캐시 데이터를 날립니다.

o update()

+ purge - create를 차례로 실행합니다.

  • 이하는 내부 함수 (이지만 밖에서 수행해도 상관없기 때문에 private를 의미하는 _를 넣지 않았습니다)

o initialize()

+ 디렉토리 없으면 만듭니다.

o getFileName

+ name에 지정된 값으로 캐시 파일 이름을 만듭니다. 규칙은 다음과 같습니다.

# name값_blogid값_로그인상태판별값(로그인상태이면owner붙임) 의 이름을 md5 값을 파일 이름으로 삼습니다. # 로그인 상태의 캐시값은 별도로 만들게 됩니다. 사실 로그인 상태의 경우는 캐싱 처리를 할 필요가 있나 싶었지만, 안하면 또 물어보는 사람 생길까봐 걍 했습니다.

o

  • 블로그의 카테고리 출력 부분, 태그 선택시 태그 설명, 리스트 출력 부분에 적용하였습니다.
  • 아직 플러시를 담당하는 함수를 넣지 않았습니다. (넣고 잘겁니다.)

follow-up: ↓ 3   Changed 2 years ago by inureyes

in reply to: ↑ 2   Changed 2 years ago by inureyes

Replying to inureyes:

* [3702] 초기 커밋.

관련해서 덤으로 메타페이지 출력 안 할때는 그 부분 함수를 안 거치도록 하는 수정이 들어갔습니다. (속도에 영향을 주네요)

  Changed 2 years ago by inureyes

  • [3703]
    • 태그별 페이지, 카테고리별 하위페이지에 대한 처리 완료

  Changed 2 years ago by inureyes

  • [3704]
    • 태그 출력 페이지 캐싱
    • 캐싱 전 1.02초 -> 캐싱 후 0.03초. 몇 배냐 이게...

  Changed 2 years ago by inureyes

  • [3705][3706]
    • page를 purge하는 과정에서 관리자 쪽만 purge되는 버그 수정

follow-up: ↓ 8   Changed 2 years ago by jparker

  • PageCache 도입으로 인한 문제
  • 카테고리 접근시 플러그인으로 하여금 변화를 주었을때 Cache로 저장한다음 그 이후엔 전혀 플러그인 영향을 받지 못합니다. 예를 들어 카테고리의 목록을 썸네일형이나 특정 목록으로 출력되게 플러그인에서 지정하게 되면 그대로 출력되어야 하는데 한번 로드후 Cache로 저장되면 그 이후부터는 플러그인에서 지정한 것으로 나오지 않고 무시하고 출력되어집니다.

in reply to: ↑ 7   Changed 2 years ago by jparker

Replying to jparker:

* PageCache 도입으로 인한 문제 * 카테고리 접근시 플러그인으로 하여금 변화를 주었을때 Cache로 저장한다음 그 이후엔 전혀 플러그인 영향을 받지 못합니다. 예를 들어 카테고리의 목록을 썸네일형이나 특정 목록으로 출력되게 플러그인에서 지정하게 되면 그대로 출력되어야 하는데 한번 로드후 Cache로 저장되면 그 이후부터는 플러그인에서 지정한 것으로 나오지 않고 무시하고 출력되어집니다.

그리고, 카테고리를 원래 목록으로 볼경우 '목록 한 쪽당 글 수'를 2개로 하여 출력후 그다음 '목록 한 쪽당 글 수'를 10개 변경을 해도 Cache된 자료를 가져오고 10개 반영이 되지 않습니다.

  Changed 2 years ago by inureyes

[3729]

  • 플러그인 activate / deactivate 시 캐시 플러싱 루틴 추가
  • entry부분의 캐시 플러싱 루틴 추가.

  Changed 2 years ago by inureyes

[3758]

  • purge 개선
  • file I/O에서 동시에 사용자가 몰릴 경우 cache 생성 시점에서 lock을 어떻게 걸어줘야 할지 생각할 차례... (아 귀찮아)

  Changed 2 years ago by inureyes

[3760]

  • 리스트 출력시 이벤트 거친 후에 캐싱하도록!

[3761]

  • 플러그인 환경 설정 변경시에 데이터 저장 부분의 리턴값이 잘못되어 발생하는 메세지 오류 수정

  Changed 2 years ago by inureyes

[3762]

  • 플러그인 inactive/active 시에 캐시 플러싱 부분 작동하도록 수정 [3763]
  • pageCache가 '제대로' flushing 되도록 수정
  • checkup시 캐시 전체를 flushing하도록 함.

  Changed 2 years ago by inureyes

[3772] 플러그인 inactive/active 시에 캐시 플러싱 항목 수정

  • inactive/active 할때마다 view관련 이벤트가 있는 플러그인에서 오류 발생
  • stripos()는 PHP5 전용이기에 strpos()로 변경

  Changed 2 years ago by inureyes

[3774]

  • 페이지캐시를 끌 수 있는 옵션 제공.
  • config.php에 $servicedisablePageCache? = true; 옵션으로 작동을 중지시킬 수 있다.

  Changed 2 years ago by inureyes

[3776]

  • 페이지 캐시 확인 루틴의 쿼리 오류 수정

[3777]

  • garbage collection을 위해 넣었던 쿼리 제거.
  • 걍 쌓일것 같으면 checkup으로 싹 밀어주는 센스를...

  Changed 2 years ago by inureyes

[3778]

  • 카테고리를 글 내용만으로 표시로 설정할 경우 pageCache가 리셋되 않는 현상.

  Changed 2 years ago by inureyes

[3780]

  • warning 나는거 수정 : 가끔 플러그인 안켜지거나 안꺼지는 문제 포함

  Changed 2 years ago by inureyes

  • status changed from assigned to closed
  • resolution set to fixed
  • 이후 적용 부분을 생각해서 로드 큰 부분에 적용합니다.
  • 가능한 부분은 생길 때 마다 파일 I/O 와 DB 출력 로드를 고려하여 결정합니다.

  Changed 2 years ago by inureyes

  • status changed from closed to reopened
  • resolution fixed deleted
  • 태그 및 카테고리 출력에서 페이징 부분이 캐시 안된다. -_-;

  Changed 2 years ago by inureyes

  • status changed from reopened to closed
  • resolution set to fixed

(QA) [3823]

  • 태그 및 카테고리 출력에서 페이징 부분을 캐싱함.
  • paging 변수 필요하다고 또 쿼리 왕창 날릴 수가 없어서 울며 겨자먹기로 하드캐싱 했다. 특정 값들에 대해서 DB단에서의 캐싱도 고려해 볼 필요가 있을 듯. (다음에다음에;; )

  Changed 2 years ago by inureyes

[3824] 버그수정.

  Changed 2 years ago by jparker

[3909]

  Changed 23 months ago by inureyes

[4090]

  • 간단한 변수 캐시로도 써먹기 위해서 pageCacheLog 테이블 확장.

follow-up: ↓ 25   Changed 23 months ago by graphittie

  • status changed from closed to reopened
  • resolution fixed deleted

BUG

Notice: unserialize() [function.unserialize]: Argument is not a string in /Users/graphittie/Projects/Textcube/trunk/single/components/Needlworks.Cache.PageCache.php on line 135

가 뜹니다.

in reply to: ↑ 24 ; follow-up: ↓ 26   Changed 23 months ago by inureyes

Replying to graphittie:

==== BUG ==== Notice: unserialize() [function.unserialize]: Argument is not a string in /Users/graphittie/Projects/Textcube/trunk/single/components/Needlworks.Cache.PageCache.php on line 135 가 뜹니다.

로그인 상태에서 체크업을 한 후 다시 확인 부탁 드립니다. :)

in reply to: ↑ 25 ; follow-up: ↓ 28   Changed 23 months ago by graphittie

Replying to inureyes:

Replying to graphittie:

==== BUG ==== Notice: unserialize() [function.unserialize]: Argument is not a string in /Users/graphittie/Projects/Textcube/trunk/single/components/Needlworks.Cache.PageCache.php on line 135 가 뜹니다.

로그인 상태에서 체크업을 한 후 다시 확인 부탁 드립니다. :)

네. 됩니다. 그런데 로그인 상태, 안 된 상태 두 번 체크업을 해야 한다니... 불편함이...

  Changed 23 months ago by graphittie

  • status changed from reopened to closed
  • resolution set to invalid

in reply to: ↑ 26   Changed 23 months ago by inureyes

Replying to graphittie:

Replying to inureyes:

Replying to graphittie:

==== BUG ==== Notice: unserialize() [function.unserialize]: Argument is not a string in /Users/graphittie/Projects/Textcube/trunk/single/components/Needlworks.Cache.PageCache.php on line 135 가 뜹니다.

로그인 상태에서 체크업을 한 후 다시 확인 부탁 드립니다. :)

네. 됩니다. 그런데 로그인 상태, 안 된 상태 두 번 체크업을 해야 한다니... 불편함이...

1.1.3에서 업글하는 경우면 한 번으로 끝입니다. :)

  Changed 23 months ago by inureyes

[4170]

  • 사용 안하면 갱신도 안합니다~

  Changed 23 months ago by inureyes

[4172]

  • 메타 페이지의 환경 설정에선 캐싱 안 합니다~

  Changed 23 months ago by inureyes

  • status changed from closed to reopened
  • resolution invalid deleted

  Changed 23 months ago by inureyes

샤워하다 든 시나리오.

  1. 카테고리뷰를 현재는 통짜 캐싱한다. (관심 있는 사람들이 들어가는 쪽이기 때문에)
  2. 댓글을 달고 싶은 사람이 댓글을 단다. (ajax니까 실시간 업데이트는 된다)
  3. 그런데 다시 오면 달았던 댓글이 없다. 왜? 캐시가 플러싱이 안 됐거든.

그러면 플러싱하면 되지 않느냐 - 에서 또 문제가 있다.

  1. 카테고리별 보기를 할 때 글을 10개씩 출력하는 경우 - 한 번 플러싱 후 캐싱하는데 파일 입출력이 거의 반 메가바이트 정도를 할 것이다.
  2. 카테고리로 들어와서 댓글을 달지 않고 다른 곳으로 와서 달아 놓은 경우 - 그 경우에 댓글이 더해져도 카테고리 뷰의 글 캐시는 갱신이 안되겠지?

결론.

  1. 댓글은 별도의 캐싱이 필요하다. 또는 안 하는 것도 방법이다.
  2. 그러면 댓글을 제외한 부분들의 캐싱을 할 수도 있을까? 스킨 구조상 복잡하다. 글 단위의 캐싱이 되어야 한다.

생각모드 들어갑니다.

  Changed 23 months ago by inureyes

  • status changed from reopened to closed
  • resolution set to fixed

[4229]

  • 예측 가능한 문제는 미리미리 해결.
  • 글 단위 캐싱 할 때 댓글 달리면 flushing 하도록 준비는 해 놓음. 적용은 안 함.

  Changed 18 months ago by inureyes

  • status changed from closed to reopened
  • resolution fixed deleted
  • milestone changed from 1.5 to 1.6

  Changed 18 months ago by inureyes

[4959]

  • 캐시 루틴 보완

  Changed 18 months ago by inureyes

[4963]

  • pageCache와 별도로 queryCache 추가.
    • pageCacheLog를 사용하는데 얘는 파일을 안쓰고 디비에만 저장합니다.
    • pageCache의 경우엔 파일 위주로 db에도 기록을 할 수 있도록 작성이 되어 있는데, 맨날 파일 확인을 하기 때문에 귀찮아 서 추가했습니다.
    • 독립적으로 놓아 두어서 유리한 점이 있기 때문에 분리헀습니다. (이후 구현의 변화라든지 다루는 테이블 바꾸기라든지.. .)
  • POD에 queryXXXWithDBCache 셋트 추가
  • DBquery가 자체 완결성을 가지도록 수정 (POD로 바꿔서 뱀꼬리 잡기의 가능성이 있었습니다)
  • DBquery에서 queryAll의 디폴트를 캐싱으로 변경
  • 스킨 캐시의 경우 제대로 동작하도록 변경.
    • 기존의 스킨 캐시는 스킨 로드 - 스킨 파싱 - 스킨 캐시 퍼지(!) 의 사이클이었습니다. (실수T_T)
    • 해석시간이 딱 두 배 빨라짐.
    • 해석후 데이터 붙이는 부분까지 캐싱할지 잠시 고려를 해 보겠습니다.

  Changed 18 months ago by inureyes

[4964]

  • 디버그 코드 해제

  Changed 18 months ago by inureyes

  • status changed from reopened to closed
  • resolution set to fixed

  Changed 18 months ago by inureyes

[4966]

  • 최근 댓글 보기에도 쿼리 캐시 도입

  Changed 18 months ago by inureyes

  • status changed from closed to reopened
  • resolution fixed deleted

[4968]

  • 댓글에 아무 비번 입력해도 메세지만 무조건 지워진다고 나오는 오류 수정 ( via coolengineer)
  • 쿼리 캐시 날리는 루틴의 오류 수정

  Changed 18 months ago by inureyes

  • status changed from reopened to closed
  • resolution set to fixed

follow-up: ↓ 44   Changed 18 months ago by graphittie

ISSUE

skin.html에 직접 사용자 태그(예를 들어 ##_TestTag_##)를 넣어 사용중인 상황에, 이 태그의 내용은 현재 선택된 메뉴/카테고리에 따라 동적으로 생성됩니다. 그런데 Page Cache가 일어나서 이 태그의 내용을 생성하는 루틴을 그냥 건너 뛰어버리고 있습니다. 위에 J.Parker님이 보고 하신 내용과 비슷한 문제로 생각됩니다.

  Changed 18 months ago by inureyes

  • status changed from closed to reopened
  • resolution fixed deleted

[5045]

  • 댓글을 관리자 화면에서 삭제할 경우 쿼리 캐시가 갱신되지 않는 문제 수정

in reply to: ↑ 42   Changed 18 months ago by inureyes

Replying to graphittie:

==== ISSUE ==== skin.html에 직접 사용자 태그(예를 들어 ##_TestTag_##)를 넣어 사용중인 상황에, 이 태그의 내용은 현재 선택된 메뉴/카테고리에 따라 동적으로 생성됩니다. 그런데 Page Cache가 일어나서 이 태그의 내용을 생성하는 루틴을 그냥 건너 뛰어버리고 있습니다. 위에 J.Parker님이 보고 하신 내용과 비슷한 문제로 생각됩니다.

임의의 스킨 치환자에 대한 부분인데, 이건 스킨 캐시의 문제인듯. #779에서 다루겠습니다.

  Changed 18 months ago by inureyes

  • status changed from reopened to closed
  • resolution set to fixed

  Changed 17 months ago by coolengineer

  • [5202] 음수가 생기지 않도록 절대값을 취함.

  Changed 15 months ago by creorix

  • status changed from closed to reopened
  • resolution fixed deleted
  • milestone changed from 1.6 to 1.7

[5747]

  • REPLACE SQL에서 queryCell을 사용하는 문제 수정

  Changed 15 months ago by inureyes

[5757]

  • [5747]을 1.6 트리에 반영

follow-up: ↓ 50   Changed 15 months ago by creorix

queryCache의 purging 루틴에 문제가 있습니다. 예를 들어, 글을 삭제했을 경우 센터의 최근 댓글 목록이나 최근 트랙백 목록에 삭제된 글과 연관된 항목이 캐싱되어 나타납니다. 이는 현재 queryCache가 query의 hash를 통해서만 캐시를 purge할 수 있도록 되어 있기 때문에 query의 hash를 모르면 특정 queryCache를 purge할 수 없어서 발생하는 문제입니다. purgeRecentCommentCache와 같은 함수를 model에 구현하는 방법도 있겠지만 어차피 캐시는 테이블이 변경될 때 리셋되면 되니까 테이블 단위로 캐시를 관리하는 것이 좋지 않을까 합니다.

in reply to: ↑ 49 ; follow-up: ↓ 54   Changed 15 months ago by inureyes

Replying to creorix:

queryCache의 purging 루틴에 문제가 있습니다. 예를 들어, 글을 삭제했을 경우 센터의 최근 댓글 목록이나 최근 트랙백 목록에 삭제된 글과 연관된 항목이 캐싱되어 나타납니다. 이는 현재 queryCache가 query의 hash를 통해서만 캐시를 purge할 수 있도록 되어 있기 때문에 query의 hash를 모르면 특정 queryCache를 purge할 수 없어서 발생하는 문제입니다. purgeRecentCommentCache와 같은 함수를 model에 구현하는 방법도 있겠지만 어차피 캐시는 테이블이 변경될 때 리셋되면 되니까 테이블 단위로 캐시를 관리하는 것이 좋지 않을까 합니다.

그럴때를 대비해서 queryCache에는 prefix option이 있을겁니다. 만들때 고려했던 기억이 나네요. :)

  Changed 15 months ago by inureyes

[5794]

  • 글 삭제시 최근글 목록과 최근 트랙백 목록이 갱신되지 않는 문제 수정
  • 예제삼아 커밋을~

  Changed 15 months ago by inureyes

  • status changed from reopened to closed
  • resolution set to fixed

  Changed 15 months ago by inureyes

[5795]

  • 글 쓸때도 캐시 갱신하도록 추가

in reply to: ↑ 50   Changed 15 months ago by creorix

Replying to inureyes:

Replying to creorix:

queryCache의 purging 루틴에 문제가 있습니다. 예를 들어, 글을 삭제했을 경우 센터의 최근 댓글 목록이나 최근 트랙백 목록에 삭제된 글과 연관된 항목이 캐싱되어 나타납니다. 이는 현재 queryCache가 query의 hash를 통해서만 캐시를 purge할 수 있도록 되어 있기 때문에 query의 hash를 모르면 특정 queryCache를 purge할 수 없어서 발생하는 문제입니다. purgeRecentCommentCache와 같은 함수를 model에 구현하는 방법도 있겠지만 어차피 캐시는 테이블이 변경될 때 리셋되면 되니까 테이블 단위로 캐시를 관리하는 것이 좋지 않을까 합니다.

그럴때를 대비해서 queryCache에는 prefix option이 있을겁니다. 만들때 고려했던 기억이 나네요. :)

아 prefix가 그 용도였군요. Cache 관련 클래스가 많아서 슬슬 헷갈립니다 =_=

  Changed 15 months ago by inureyes

[5798]

  Changed 15 months ago by inureyes

[5799]

  • 캐시 관련 보정. 생길수 있는 부분들에서 모두 트랙백/댓글 캐시를 갱신하도록 함.
  • 필요없던 addEntry때의 캐시 갱신 부분 삭제

  Changed 15 months ago by inureyes

[5800]

  • 문서 업데이트

[5801]

Note: See TracTickets for help on using tickets.