2012-09-15 4 views
0

최근 yii 블로그 데모의 수정 된 버전 인 블로그를 php yii 웹 사이트에 추가했습니다. 내 블로그는 유감스럽게도 약 20 개의 데이터베이스 호출을 사용하여 게시를 표시하는 활성 레코드를 사용합니다. Memcache를 사용하여 속도를 높이고 싶습니다. DB 호출의 미친 숫자를 없애기 위해 메모리에서 할 수있는만큼 많은 내용을 캐시하고 싶습니다. 스키마 캐싱을 이미 사용하도록 설정 했으므로 12 또는 13과 같이 더 많은 전화가 끊어 지지만 여전히 너무 많습니다.memcache on yii 블로그 아키텍처

내 블로그를로드하는 동안 부하가 많이 걸리면 내 CPU가 제한 요소라는 것을 알았습니다. 나는 아직도 많은 양의 숫양을 가지고있다. 그래서 나는 그 여분의 램을 사용하는 것이 나의 CPU에 걸리는 부하를 줄이기를 바라고있다. 그것이 memcache가 들어오는 곳입니다. 문제는 그것을 구성하는 방법입니다.

코멘트와 태그가있는 단일 게시물을 캐싱하는 방법을 알아 냈습니다. 그다지 어렵지 않습니다. 내가 고민하는 것은 인덱스 페이지를 캐시하는 방법이다. 5 개 게시물이 것 1 페이지, 2 페이지 내가 만들고있어 등, 5 게시물있을 것 같은 데이터베이스 전화 :

  $criteria=new CDbCriteria(array(
        'condition'=>'status='.Post::STATUS_PUBLISHED, 
        'order'=>'create_time DESC', 
        'with'=>'commentCount', 
      )); 
      if(!is_null($tag)) 
        $criteria->addSearchCondition('tags', $tag); 

      $dataProvider=new ActiveDataProvider('Post', array(
        'pagination'=>array(
          'pageVar'=>'page', 
          'pageSize'=>5, 
        ), 
        'criteria'=>$criteria, 
      )); 

      $this->render('index',array(
        'dataProvider'=>$dataProvider, 
      )); 

나는 원래 그냥 쿼리 문자열과 결과 $의 dataProvider의 캐시 할 수 생각 열쇠. 내가 가질 수있는 무엇인가 :

echo http_build_query($criteria->toArray()); 

나는 그 열쇠에 페이지 번호를 붙일 것이다. 그러나 그것은 쉽다. 그러나 이렇게하면 모든 페이지와 모든 태그에 대해 별도의 dataProvider를 캐시해야하므로 태그를 업데이트하거나 새 게시물을 추가하는 경우 업데이트 할 수있는 악몽이됩니다.

나는 훌륭한 사람들 중 한 사람이 나에게 몇 가지 제안을 할 수 있다고 확신합니다. 나는 이것을 설계하는 방법을 놓치고있다.

+0

전체 페이지를 캐시하지 않는 이유는 무엇입니까? – Ansari

+0

그게 내가 말하는거야. 만약 내가 각 페이지를 잡으려고했다면, 새로운 게시물을 만들려면 캐시의 모든 인덱스 페이지와 동일한 태그가 붙은 게시물과 관련된 페이지를 무효화해야합니다. – Erreth

+0

나는 캐시를 무효로하는 것이 그렇게 큰 문제라고 생각하지 않습니다. 이제 20 개의 DB 호출과 많은 PHP 코드 실행 * pageload *가 있으면 새 게시물이나 새 태그가있을 때마다이 코드를 갖게됩니다. 당신은 많이 얻고 있습니다. – Ansari

답변

1

내 의견으로는 페이지 전체 또는 페이지 조각을 캐싱하는 것이 좋습니다.

전체 페이지 (또는 작업)를 캐싱하기 위해 yii는 COutputCache을 제공합니다. 단편 캐싱의 경우 CController::beginCache()CController::endCache()이 있습니다. 더 많은 정보를 위해 만료 설정 외에 YII 문서

에서 내용 변경

에 캐시를 무효화 정보 page cachingfragment caching

설명서를 참조 캐시 된 데이터는 일부에 따라 을 무효화 할 수있다 의존성 변화. 예를 들어 일부 파일의 내용을 캐싱하고 파일을 변경하는 경우 캐시 된 복사본을 무효화하고 캐시에서 대신 파일의 최신 내용을 읽어야합니다.

종속성은 CCacheDependency 또는 그 하위 클래스의 인스턴스로 지정할 수 있습니다. 특정 들어 특정 포스트 항목의 페이지를 캐시에 대한

SELECT `update_time` from post where `id`=:id 

같은 SQL로 CDbCacheDependency를 사용할 수 있어야합니다.

다른 사용 가능한 종속성 클래스는 documentation

+0

그러나 CDbCacheDependency를 사용하면 모든 캐시 적중 전에 캐시 항목이 유효한지 확인하기 위해 쿼리가 실행됩니다. 그래서 특정 의존성이 값이 비싼 SQL 쿼리를 하나 교환하는 것을 사용한다면 그렇게 할 수 있습니까? 이제 종속성 쿼리가 대신 표시 될 수 있기 때문입니다. 나는 아직도 많은 쿼리를 가지고있다. 어쩌면 종속성을 사용하지 않는 것이 나을 것입니다. 캐시 항목을 직접 무효화하는 것입니다. 나는 내가 말한 방식대로 많은 쿼리를 저장하게 될 것입니다. 몇 가지 벤치 마크를 실행 해 보겠습니다. – Erreth

+0

CDbCacheDependency를 사용하지 않아도됩니다. 다른 의존성을 사용할 수 있습니다. 예를 들어 게시물의 업데이트 타임 스탬프를 파일에 저장하고 CFileCacheDependency를 사용할 수 있습니다. – dInGd0nG

+0

도움 주셔서 감사합니다. 일부 벤치 마크 이후에는 종속성이있는 쿼리 캐싱을 사용하여 보니 블로그가 훨씬 빨라졌습니다. 내 쿼리가 비용이 많이 들지 않는 것과는 달리 많은 쿼리가 있습니다. 종속성 사용은 다른 유형의 종속성과도 관계없이 다른 쿼리를 하나의 쿼리와 교환합니다. yii의 get 및 set 구현을 사용하고 캐시 항목을 직접 손으로 무효화하는 방법을 살펴 보겠습니다. 다행히 그 일이 빠르게 진행됩니다. – Erreth