2012-08-08 5 views
4

그냥 조언을 찾고 있습니다. 우리 웹 사이트 중 하나에는 토론/포럼 사이트가 있습니다. 사용자가 토론 페이지를 요청할 때마다 사용자는 모든 주제 (및 답변 개수 등)의 목록을 가져옵니다.PHP에서 토론/포럼 항목 캐싱

사용자가 특정 주제/스레드를 요청할 때도 해당 스레드에 대한 모든 답변이 사용자 이름, 사용자 사진, 나이, 답변 게시자의 총 포럼 게시물 수와 함께 오랫동안 사용자에게 표시됩니다.

모든 콘텐츠는 현재 페이지에 액세스 할 때마다 MySQL- 쿼리를 사용하여 검색됩니다. 그러나 이것은 고통스럽게 느려지 기 시작합니다 (특히 큰 스레드, +3000 응답).

나는이 처리 속도를 높이기 위해 어떻게 든 논쟁 항목을 캐싱하고 싶습니다. 그러나 문제는 내가 항목을 캐시하면 게시 횟수 등 (물론 동적 임)이 항상 최신 정보가 아닐 수 있다는 것입니다.

이와 같은 정보가 업데이트되면 페이지를 캐싱/캐싱하는 스마트 방법이 있습니까? :) 사전에

감사합니다, 피셔

답변

2

당신은 태그 또는 그것의 데이터를 기반으로 캐시의 이름을 만들어야합니다.

제이크의 포스트라는 이름의 게시물에 대한 예를 들어 당신은 이름의 MD5를 만들 수 있습니다, 이것은 당신에게 태그 49fec15add24931728652baacc08b8ee을 줄 것입니다.

이제이 게시물과 관련된 모든 내용을 49fec15add24931728652baacc08b8ee 태그와 함께 캐시하십시오. 게시물이 업데이트되거나 댓글이 추가되면 캐시로 이동하여 49fec15add24931728652baacc08b8ee과 관련된 모든 항목을 삭제하십시오.

이제 캐시가 없으며 다음 방문자가 새로운 게시물에 도착하면 다시 캐시됩니다.

게시물 당 여러 개의 태그를 추가하면 더 많은 문제를 해결할 수 있습니다. 예를 들어 댓글과 답변을위한 태그를 추가 할 수 있습니다. 덧글을 추가하면 덧글 태그를 삭제할 수 있지만 answer 태그는 삭제할 수 없습니다. 이렇게하면 주석 만 누락되므로 캐시를 다시 작성할 때 서버가해야하는 작업이 줄어 듭니다.

이렇게하는 데 도움이되는 라이브러리와 프레임 워크가 많이 있습니다.

제이크

내가 데이터를 저장하는 파일을 사용하십시오

편집, 페이지 더 구체적으로 HTML 출력. 당신은 다음과 같이 수행 할 수 있습니다.

if(file_exists($tag)) 
{ 
    // Load the contents of the cache file here and output it 
} 
else 
{ 
    // Do complex database look up and cache the file for later 
} 

젠드 같은 프레임 워크에 내장 된 물건의 종류가 기억을 난 심각 프레임 워크를 사용을 고려한다.

+0

입력 해 주셔서 감사합니다. 그것을하는 중대한 방법 같이 소리가 난다. 이를위한 데이터베이스 계획을 세우겠습니다. MySQL에 캐시를 저장하는 것은 좋은 생각입니다. 캐시 된 항목을 저장하는 다른 방법을 찾아야합니다 (어쨌든 캐시 코드를 다시 작성해야하므로, 기구)!? – fischer

+0

파일 파일을 사용할 것입니다. 내 편집을 참조하십시오. –

0

흥미로운 주제!

가장 먼저 살펴볼 것은 데이터베이스를 최적화하는 것입니다. 하드웨어를 업그레이드하는 데 돈을 써야 할지라도 캐시를 도입하는 것보다 훨씬 쉽고 저렴합니다 - 움직이는 부분이 적고 잘못 될 수있는 일이 적습니다. ...

데이터베이스에서 더 많은 성능을 끌어낼 수 없다면 다음으로 고려해야 할 사항은 데이터를 약간 표준화 해제하는 것입니다. 예를 들어, 각 주제에 대한 응답을 계산하는 대신 "reply_count"열을 유지하십시오. 이것은보기 싫지만 일이 잘못 될 가능성이 적습니다. 운이 좋으면 데이터 액세스 레이어의 모든 로직을 현지화 할 수 있습니다.

다음 옵션은 페이지를 캐시하는 것입니다. 예를 들어 "토론 페이지"를 30 초 동안 캐싱하면 합리적인 수준의 트래픽이 발생하는 경우 데이터베이스의 부하가 크게 줄어들지 만 전체 페이지가 캐싱되어 모든 것이 잘못되어도 다음 번에 페이지가 오래 될 경우 자체를 분류하십시오. 대부분의 상황에서 전체 페이지 캐싱은 괜찮습니다. 지난 30 초 내에 새로운 소식이 표시되고 페이지에 표시되지 않으면 세상이 끝난 것이 아닙니다.

페이지에서 "최신"콘텐츠를 더 많이 제공해야하는 경우 데이터베이스 액세스 수준에서 캐싱을 도입 할 수 있습니다. 필자는 과거에 결과를 캐시하는 데 걸린 시간에 대한 하드웨어 논리에 기반한 SQL 쿼리 결과를 캐싱하는 데이터베이스 액세스 계층을 구축했습니다. 여기서는 쿼리를 지정 (예 : 사용자에게 게시물 가져 오기), 매개 변수 배열 (예 : username, date-from) 및 캐시 기간을 지정할 수있는 데이터베이스를 호출하는 함수를 만들었습니다. 데이터베이스 액세스 함수는 쿼리 및 매개 변수를 기반으로 캐시 기간에 대한 결과를 캐시합니다. 캐시 기간이 만료되면 캐시를 새로 고칩니다. 이 스키마는 버그를 방지했습니다. 최종 사용자는 캐싱으로 인한 기괴함을 거의 느끼지 못할 것이며, 캐시 기간을 상당히 짧게 유지했기 때문에 모든 것이 매우 빠르게 정리되었습니다.

콘텐츠 스 니펫 (snippet)을 캐싱하여 페이지를 만들 수도 있지만 매우 빠르게 복잡해집니다. 다른 캐싱 정책으로 인해 최종 사용자가 이해할 수없는 페이지를 만드는 것은 매우 쉽습니다. "요약"과 "요약"사이의 캐싱 정책이 다르기 때문에 "읽지 않은 게시물"이 분류 된 게시물 수를 더하지 않습니다. 세부 묘사".