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


Concrete CMS 8.5.0 より、Redis キャッシュをコアで使えるようになりました。

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

- Redis のエンドポイント・ポート番号を適宜設定変更してください
- php-pecl-redis をサーバーにインストールしてください。 (Amazon Linux 2 へは後述の参考記事参照。)
- 複数の Concrete CMS を同じ Redis 内で動かす場合は、キャッシュ部分の `database` の ID がかぶらないように設定してください。
- Session の設定は `name` が被らないようにしてください。database は `0` のままで良いです。
- Redis のデフォルトでは `database` は 0~15 までしか設定できないため、理論上は 7 つの Concrete CMS サイトの共存が可能です。(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 // 接続までのタイムアウト秒
	        ],
	    ],
    ],
];

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

/*
$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,
        ]]
);
*/

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

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

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


## 参考記事

- [Amazon Linux 2 の PHP7.2 で ElastiCache の Redis を使う方法](https://qiita.com/katzueno/items/95254fdcf5e357c52202)
- [Concrete CMS で環境ごとに別の設定ファイルを読み込む方法](https://qiita.com/katzueno/items/43258716424aac82468f)