[CakePHP4]Cacheを使ってページ表示速度を高速化する方法

[CakePHP4]Cacheを使ってページ表示速度を高速化する方法
2023年10月20日2023年10月20日

ウェブページの表示速度は、ユーザーエクスペリエンスやSEOに大きく影響します。

CakePHP4を用いた開発において、表示速度を向上させる鍵となるのが「Cache」機能です。

この記事では、CakePHP4のCacheを使ってページのローディング速度を劇的に高速化する方法を解説します。

基本的なCacheの使い方

キャッシュの設定

CakePHPでは、config/app.phpの中にキャッシュの設定を行います。デフォルトでいくつかの設定が用意されており、それらをカスタマイズしたり、新しい設定を追加することができます。

config/app.php
'Cache' => [
    'default' => [
        'className' => 'File',
        'path' => CACHE,
        ...
    ],
    // 他のキャッシュ設定
],

キャッシュの保存

キャッシュを保存する際は、Cache::write()メソッドを使用します。

use Cake\Cache\Cache;

$data = ["name" => "John", "age" => 30];
Cache::write('my_key', $data);

キャッシュの読み込み

キャッシュからデータを取得するには、Cache::read()メソッドを利用します。

$data = Cache::read('my_key');

キャッシュの削除

キャッシュを削除する場合は、Cache::delete()メソッドを使用します。

Cache::delete('my_key');
注意: 実際のアプリケーションの開発においては、キャッシュの適切な使用や不要なキャッシュの削除、キャッシュの更新のタイミングなど、考慮すべきポイントが多く存在します。適切にキャッシュを利用することで、パフォーマンスの向上やサーバーのリソースの節約などの利点を得られます。

CakePHPのキャッシュの種類

CakePHPは高速なページ表示をサポートするため、多種多様なCache機能を備えています。これにより、開発者はさまざまなシチュエーションに応じて最適なキャッシュを利かせることができます。

Select句のCache

SELECTクエリの結果をキャッシュする場合、下記のようにします。

use Cake\Cache\Cache;

$results = Cache::remember('my_select_query_result', function () {
    // 実際のクエリを実行
    $results = $this->MyModel->find('all')->toArray();

    // クエリの結果をキャッシュに保存
    Cache::write($cacheKey, $results);
});

return $results;

上記の書き方は推奨されません。キャッシュの処理が直接記述されていることで、ビジネスロジックの可読性が低下し、理解を難しくする原因となる可能性があります。

クエリビルダのCacheを使う

クエリビルダにcacheメソッドが準備されているので下記のような書き方をします。

use Cake\ORM\TableRegistry;

$articles = TableRegistry::getTableLocator()->get('Articles');
$query = $articles->find('all');

$cachedResults = $query->cache('my_articles_key', '+1 hours')->all();

ですが、この書き方は毎度cacheキーを考えて引数に指定しないといけません。名前が被ったりと結構面倒です。

クエリビルダでCacheを使いたい場合は、Finderを使用したパターンで実装するとすっきりします。

Modelクラスに下記メソッドを定義します。
※Modelの親クラスとかがおすすめ

use Cake\Cache\Cache;
use Cake\ORM\Query;

/**
 *
 * @param Query $query
 * @param array $options
 * @return $this
 */
public function findCachedEntity(Query $query, array $options)
{
    return $query->cache(function ($q) {
        return $this->getTable() . "_data_" . md5(
            serialize($q->sql()) . serialize($q->getValueBinder()->bindings())
        );
    }, 'entities')
        ->counter(function ($q) {
            return Cache::remember($this->getTable() . "_count_" . md5(serialize($q->sql()) . serialize($q->getValueBinder()->bindings())), function ()  use ($q) {
                return $q->count();
            });
        }, 'entities');
}

上記の処理は、CacheキーをSQLとバインド変数の内容でCacheキーを作成してCacheを保存しています。

またcounter()メソッドは、ページング処理を行うときに自動で件数取得のSQLが発行されているかと思いますが、その件数取得のSQLをCacheさせるための記述になっています。

Controllerから下記で呼び出すことができます。

findの引数にModelで定義したFinderを指定します。

$article = $this->Articles->find('cachedEntity')->firstOrFail();

ビューのテンプレート内で部分的にCacheする

ビューのテンプレート内で部分的にコンテンツをキャッシュするためのCacheHelperが提供されています。CacheHelperを使用することで、テンプレートの一部分のみをキャッシュし、ページのロード速度を向上させることができます。

Controllerに下記を定義します。

public $helpers = ['Cache'];

テンプレート内で、cacheメソッドを使ってキャッシュを開始・終了します。

// キャッシュの開始
$this->Cache->start('unique_cache_key');

// キャッシュする内容
echo $this->Html->link('Example', ['controller' => 'examples', 'action' => 'index']);

// キャッシュの終了
$this->Cache->end();

cellをCacheする

$this->cellメソッドを使用する際にキャッシュのオプションを指定することで、Cellの出力をキャッシュすることができます。

echo $this->cell('Example::display', [], ['cache' => [
    'key' => 'unique_cell_cache_key',
    'duration' => '+1 hours'
]]);

ElementをCacheする

cellと同様ElementもCacheすることができます。

echo $this->element('example_element', [], ['cache' => [
    'key' => 'unique_element_cache_key',
    'duration' => '+1 hours'
]]);

Cacheの削除コマンド

Cacheで生成されたファイルは基本的に自動削除されません。Cacheを使用する場合はCronなどで削除コマンドを実行してあげる必要があります。

# 指定したキーのみ削除
bin/cake cache clear [config_name]

# すべてのキャッシュ削除
bin/cake cache clear_all

最後に

キャッシュとは、ウェブアプリの動作をスピードアップさせる仕組みです。

この記事を通して、CakePHPでのキャッシュの使い方の基本を学びました。

正しく使えば、サイトの速度が飛躍的に向上しますが、間違った使い方をすると逆効果になることも。

大事なのは、キャッシュを上手に活用しながら、新しいデータや変更点もきちんと反映させるバランスを取ることです。日々の開発に役立てて、ユーザーに快適な体験を提供しましょう!

 

コメント

コメントを残す

お名前(任意)
コメント:新規