CakePHP

CakePHPでページネーションのキャッシュ

CakePHPにはPaginatorというページネーション用のヘルパーが用意されています。
使い方は簡単で、例えばコントローラにて次のように呼び出します。

$this->paginate	= array(
	'conditions'    => $cond,
	'order'			=> array('id'=>'DESC'),
);
$result	= $this->paginate($tb_name);

ビューでは次のようにして出力することができます。

<?php echo($this->Paginator->numbers()); ?>

ここではページネーションと、一覧部分もキャッシュします。
それと、全ページをキャッシュするのもなんですので、一番PVが多そうな1ページ目だけキャッシュします。
キャッシュはCacheヘルパーを使います。ページネーション含めたコードは下記になります。

// 現在のURLを取得
$url	= $this->params->url;

// 1ページ目であればURLをキーにして、それ以外はfalseに設定
$key	= preg_match("/page:(\d)+/", $url, $key) ? false : $url;
// ビューに$keyを渡します
$this->set("key", $key);

// キャッシュがあればキャッシュが返す値をビューに設定
if ( $key && $result = Cache::read($key) ){ 
	$this->set('items', $result);
	return;
}

// ページネーション
$this->paginate	= array(
	'conditions'    => $cond,
	'order'			=> array('id'=>'DESC'),
);
$result	= $this->paginate($tb_name);

// キャッシュの記録
Cache::write($key, $result);

ビューは次のようになります。まずページネーション部分です。

<?
// キャッシュがある場合はキャッシュのページネーションを出力
if ( isset($key) && $key != null && $p	= Cache::read($key."paging")) {
	echo($p);
} else {
	// キャッシュがない場合はPaginatorを使ってページネーションを出力
	php echo($this->Paginator->numbers()); 
	if ( isset($key) ) Cache::write($key."paging", $p." ");
}
?>

一覧は次のようになります。

<?php if (isset($items) && count($items)): ?>
<ul>
<?php foreach ($items as $v): ?>
	<li><?php eh($v['...']['...']) ?></li>
<?php endforeach; ?>
</ul>

関連記事