EC-CUBE4 Doctrine 高速化

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/eccubedoctrine_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_cachelifetime がキャッシュの保持時間です。この例では1日(86400秒)にしています。

コード側で個別に指定する

設定ファイルの値は全体に適用されますが、特定のクエリだけ保持時間を変えたい場合はコードで直接指定できます。独自に追加したリポジトリなどで有効です。

$qb->getQuery()
   ->useResultCache(true, 86400)
   ->getResult();

第2引数が秒数です。この書き方は3系・4系のどちらでも使えます。

延ばす前に確認すること

キャッシュの保持時間を延ばすと、管理画面でデータを更新しても、その時間が経過するまで画面に反映されません

「カテゴリ名を変えたのに変わらない」「ページを追加したのに出てこない」という問い合わせは、この設定が原因のことがあります。運用担当者が管理画面から日常的に更新するデータについては、長い時間を設定しないでください。

また、キャッシュで改善するのは同じクエリの繰り返しだけです。1ページで大量のSQLが発行されている場合、原因はキャッシュではなくクエリの組み立て方にあります。まずは実行されているクエリ数を計測してください。手順はEC-CUBEのサイトが重いときの原因特定と改善方法にまとめています。

日本発!ECオープンプラットフォーム「EC-CUBE」 EC-CUBEゴールドパートナー EC-CUBEは株式会社イーシーキューブの商標です

EC-CUBEに関するお問い合わせ


    [重要]現在公式にセキュリティサポートが切れていないPHPは8.1以上、MySQLは8.0以上で、対応しているEC-CUBEバージョンは4.2以上です。古いEC-CUBEを使っている方は適切なタイミングでバージョンアップをご検討ください。

    EC-CUBEバージョンアップ