concrete5 (8.5.0 以降) で Redis を使う方法


さきほどリリースされた concrete5 8.5.0 で、コンクリートファイブジャパン株式会社の敏腕 CTO である Derek 氏が、Redis キャッシュをコアで使えるようにしてくれました。

concrete5 の config への Redis サーバーの設定方法のサンプルを書いておきます。

  • Redis のエンドポイント・ポート番号を適宜設定変更してください
  • php-pecl-redis をサーバーにインストールしてください。 (Amazon Linux 2 へは後述の参考記事参照。)
  • 複数の concrete5 を同じ Redis 内で動かす場合は、キャッシュ部分の database の ID がかぶらないように設定してください。
  • Session の設定は name が被らないようにしてください。database は 0 のままで良いです。
  • Redis のデフォルトでは database は 0~15 までしか設定できないため、理論上は 7 つの concrete5 サイトの共存が可能です。(Session 情報は database 0 を利用し続けたとして) ただし、キャッシュのサイズなどでパフォーマンスや容量不足が起こる可能性がありますので、かならず検証してください。
/application/config/concrete.php
<?php

// overrides キャッシュ設定の定義 $redisDriverOverrides
$redisDriverOverrides = [
    'preferred_driver' => 'redis',
    'drivers'=> [
        'redis'=>[
            'options' => [
                'servers' => [
                    [
                        'server' => '【Redis のエンドポイント】', // localhost もしくは ElastiCache などのエンドポイント
                        'port' => 6379, // ポート番号
                        'ttl' => 30 // 接続までのタイムアウト時間
                    ],
                ],
                'prefix'=>'c5_cache', // prefix は変更可能
                'database'=> 1 // デフォルトでは 0~15 まで選べる。複数サイトを格納する場合は別の番号に!
            ],
        ],
    ],
];
// expensive キャッシュ設定の定義 $redisDriverExpensive
$redisDriverExpensive = [
    'preferred_driver' => 'redis',
    'drivers'=> [
        'redis'=>[
            'options' => [
                'servers' => [
                    [
                        'server' => '【Redis のエンドポイント】', // localhost もしくは ElastiCache などのエンドポイント
                        'port' => 6379, // ポート番号
                        'ttl' => 30 // 接続までのタイムアウト時間
                    ],
                ],
                'prefix'=>'c5_cache', // prefix は変更可能
                'database'=> 2 // デフォルトでは 0~15 まで選べる。複数サイトを格納する場合は別の番号に!
            ],
        ],
    ],
];

$cache = [];
$session = [];

// キャッシュ設定の定義。フルページキャッシュの保存先の設定と、さきほどの $redisDriverOverrides & $redisDriverExpensive の設定値を適用。Objectキャッシュはデフォルトのメモリのままにする(その方が高速) その他 Expensive キャッシュを SQLite に設定する方法などもあり
$cache = [
    'page' => [
        'adapter' => 'redis',
        'redis' => [
            'servers' => [
                [
                    'server' => '【Redis のエンドポイント】', // localhost もしくは ElastiCache などのエンドポイント
                    'port' => 6379, // ポート番号
                    'ttl' => 30 // 接続までのタイムアウト秒
                ],
            ],
            'prefix'=>'page',
            'database'=> 3 // デフォルトでは 0~15 まで選べる。複数サイトを格納する場合は別の番号に!
        ],
    ],
    'levels' => [
        'overrides' => [
            'drivers' => $redisDriverOverrides,
        ],
        'expensive' => [
            'drivers' => $redisDriverExpensive,
        ],
        'object' => [
            'preferred_driver' => 'core_ephemeral'
        ],
    ],
];

// PHP Session の保存先を定義
$session = [
    'name' => 'CONCRETE5', // セッション名 複数サイトを格納する場合はここをサイトごとに名前を変えてください。
    'handler' => 'redis',
    'redis' => [
        'database' => 0, // デフォルトでは 0~15 まで選べる。ひとまず "0" はセッションを保存するようにしましょう。

    ],
    'servers' => [
        [
            'server' => '【Redis のエンドポイント】', // localhost もしくは ElastiCache などのエンドポイント
            'port' => 6379, // ポート番号
            'ttl' => 10 // 接続までのタイムアウト秒
        ],
    ],
];

/* concrete5 のキャッシュ設定
--------------------------
環境別にキャッシュ設定を分けたい場合に、
下記のコメントアウト部分を有効にし設定します。
*/

/*
$cache = array_merge(
    $cache, ['blocks' => true,
        'assets' => true,
        'theme_css' => false,
        'overrides' => true,
        'pages' => 'blocks',
        'full_page_lifetime' => 'default',
        'full_page_lifetime_value' => '30',
        'clear' => [
            'thumbnails' => false,
        ]]
);
*/

// ここで concrete5 に設定を返す
return [
    'cache' => $cache,
    'session' => $session,
    'misc'              => [
        'app_version_display_in_header' => false, // この Qiita 記事とは関係ない設定
    ],
];

concrete5 8.4.x であれば、オーバーライドする方法で Redis を使えるようにしています。

詳しくは GitHub のレポジトリを御覧ください。
https://github.com/concrete5cojp/concrete5-redis-override

参考記事