0

私は最近、私の php yii Web サイトにブログを追加しました。これは、yii ブログのデモを大幅に変更したバージョンです。私のブログはアクティブ レコードを使用していますが、残念ながら投稿を表示するために約 20 回のデータベース呼び出しを使用しています。これを memcache で高速化したいと思います。その非常識な数の db 呼び出しを取り除くために、できるだけ多くのコンテンツをメモリにキャッシュしたいと思います。すでにスキーマ キャッシングを有効にしています。これにより、呼び出しの数は 12 または 13 程度に削減されますが、それでも多すぎます。

ブログの負荷テストを行っているときに、高負荷下では CPU が制限要因であることがわかりました。ラムはまだたくさんあります。そのため、その余分な RAM の一部を使用することで、CPU の負荷が軽減されることを願っています。そこで memcache の出番です。問題は、それをどのように設計するかです。

コメントとタグを使用して単一の投稿をキャッシュする方法を理解しましたが、それほど難しくありません。私が苦労しているのは、それぞれに多数の投稿があるインデックスページをキャッシュする方法です。ページ 1 には 5 つの投稿があり、ページ 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 をキャッシュする必要があり、タグを更新したり、新しい投稿を追加したりする場合に更新するのは悪夢です。

優秀な方の 1 人が私にいくつかの提案をしてくれると確信しています。私はこれをどのように設計するか途方に暮れています。

4

1 に答える 1

1

私の意見では、ページ全体またはページの断片をキャッシュすることが最善の方法です。

ページ全体 (またはアクション) をキャッシュするために、yii は を提供しますCOutputCache。また、フラグメント キャッシングにはCController::beginCache()とがありCController::endCache()ます。詳細については、ページ キャッシングフラグメント キャッシングのドキュメントを参照してください。

コンテンツ変更時のキャッシュの無効化について

yii ドキュメントより

有効期限の設定に加えて、依存関係の変更に応じて、キャッシュされたデータが無効になることもあります。たとえば、あるファイルのコンテンツをキャッシュしていて、そのファイルが変更された場合、キャッシュされたコピーを無効にして、キャッシュの代わりにファイルから最新のコンテンツを読み取る必要があります。

CCacheDependency依存関係は、またはその子クラスのインスタンスによって指定できます。特定のニーズに合わせて、次のCDbCacheDependencyような SQL を使用できます。

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

特定の投稿エントリのページをキャッシュするため。

他の利用可能な依存関係クラスについては、ドキュメントを参照してください

于 2012-09-15T07:40:13.413 に答える