EC-CUBEはカテゴリツリーやページ情報など、頻繁には変わらないデータの検索結果をキャッシュしています。この保持時間は設定で変更でき、商品数やカテゴリ数が多いサイトでは表示速度に効きます。設定の書き場所が4系と3系で違うので、両方の手順を載せます。
キャッシュされているのはどのデータか
EC-CUBE本体では、カテゴリ・ページ・レイアウトの取得処理などでDoctrineの結果キャッシュが使われています。同じクエリの結果を一定時間使い回すため、その間はデータベースへの問い合わせが発生しません。
カテゴリ階層が深い、登録カテゴリ数が多いといったサイトでは、この処理がページ表示のたびに走ると負荷になります。保持時間を延ばせばその分だけ問い合わせが減ります。
EC-CUBE4での変更方法
4系では設定ファイルが用意されているので、新しくファイルを作る必要はありません。app/config/eccube/packages/eccube.yaml を開いてください。
次の2行があります。
eccube_result_cache_lifetime: 3600 # doctrineのresult cacheのlifetime.
eccube_result_cache_lifetime_short: 10 # 商品一覧画面など長期間キャッシュできない箇所で使用する.
2つに分かれているのが4系の特徴です。
eccube_result_cache_lifetime(既定3600秒=1時間)— カテゴリやページなど、更新頻度が低いデータ用eccube_result_cache_lifetime_short(既定10秒)— 商品一覧など、在庫や公開状態がすぐ反映されてほしい箇所用
保持時間を延ばす場合は前者の数値を変更します。1日にするなら次のとおりです。
eccube_result_cache_lifetime: 86400
後者(_short)を安易に延ばさないでください。商品一覧の表示に使われているため、値を大きくすると商品を非公開にしても一覧から消えない、在庫切れが反映されないといった形で表面化します。
変更後はキャッシュクリアが必要です。
php bin/console cache:clear --no-warmup
EC-CUBE3での変更方法
3系はファイル構成が異なります。既定値は src/Eccube/Resource/config/doctrine_cache.yml.dist に書かれていますが、このファイルは直接編集しません。本体のファイルなので、更新時に上書きされます。
app/config/eccube に doctrine_cache.yml を新規作成し、設定を記載します。
doctrine_cache:
metadata_cache:
driver: array
query_cache:
driver: array
result_cache:
driver: array
lifetime: 86400
clear_cache: true
hydration_cache:
driver: array
result_cache の lifetime がキャッシュの保持時間です。この例では1日(86400秒)にしています。
コード側で個別に指定する
設定ファイルの値は全体に適用されますが、特定のクエリだけ保持時間を変えたい場合はコードで直接指定できます。独自に追加したリポジトリなどで有効です。
$qb->getQuery()
->useResultCache(true, 86400)
->getResult();
第2引数が秒数です。この書き方は3系・4系のどちらでも使えます。
延ばす前に確認すること
キャッシュの保持時間を延ばすと、管理画面でデータを更新しても、その時間が経過するまで画面に反映されません。
「カテゴリ名を変えたのに変わらない」「ページを追加したのに出てこない」という問い合わせは、この設定が原因のことがあります。運用担当者が管理画面から日常的に更新するデータについては、長い時間を設定しないでください。
また、キャッシュで改善するのは同じクエリの繰り返しだけです。1ページで大量のSQLが発行されている場合、原因はキャッシュではなくクエリの組み立て方にあります。まずは実行されているクエリ数を計測してください。手順はEC-CUBEのサイトが重いときの原因特定と改善方法にまとめています。
EC-CUBEに関するお問い合わせ
[重要]現在公式にセキュリティサポートが切れていないPHPは8.1以上、MySQLは8.0以上で、対応しているEC-CUBEバージョンは4.2以上です。古いEC-CUBEを使っている方は適切なタイミングでバージョンアップをご検討ください。