Cakephp 2.x でページネートの結果をキャッシュ

Webアプリケーションのパフォーマンス改善の筆頭といえばキャッシュです。

データベースへなどへのアクセスが必要なデータをメモリやファイルに持っておけば負荷も減りますし、頼もしい限り。

 

Cakephp (2.x)では、基本的に

キャッシュにデータ書き込み
$result = array(‘result’ => 100);
Cache::write(‘result’, $result, ‘paginate_cache’);

 

キャッシュデータ呼び出し
$result = Cache::read(‘result’, ‘paginate_cache’);

//result = array(‘result’ => 100)

 

で大丈夫なんですが、ページネータの場合はさらに2つの操作が必要になります。

リクエストオブジェクトのparamsパラメータの’paging’キーのキャッシュと、コントローラ内でのPaginatorHelperの使用宣言です。

 

pagingキーに入っている値っていうのはカウント数とか、ページ数を持っている配列ですね。

↓こういう値が入ってます。

WS000076

んで、キャッシュするときにこの値もちゃんとCache::writeでとっておかないと、「結果0件なのに表示されてる。。。けど1ページ目しかない」みたいな表示にバグります。

なので、

$paging = $this->request->params[‘paging’];

Cache::write(‘paging’, $paging, ‘paginate_cache’);

 

$paging = Cache::read(‘paging’, ‘paginate_cache’);

$this->request->params[‘paging’] = $paging;

 

のように、キャッシュを呼び出す時にもう一回設定しなおさないとダメなんですね。

2つめの「PaginatorHelperの使用宣言」ってのはこういうのです。

WS000074

これを設定しておかないと、クエリパラメータとかちゃんととってくれません。 Cakephpのコードを見てみると、確かにPaginatorComponentのpaginateメソッドの最後で設定してます。

WS000077

キャッシュを使うときはこのpaginateメソッドを通らないので、自分で設定しておく必要があるってことですね。 これで Order by とかが重くなりがちなpaginateも余裕のクリアです。

でも売り切れ状態とかリアルタイムでほしいステータスもキャッシュしてしまうので気をつけてください。