約200%早くなった! EC-CUBE3のパフォーマンスチューニング - キャッシュの設定方法
EC-CUBE Ver.3.0.11以降では、設定ファイルを追加する事で各種キャッシュを利用できる様になり、表示速度の向上ができます。
今回、EC-CUBEの開発コミュニティーで、ヘテムルでEC-CUBE3が遅いと書き込みがあったのでご紹介します。
結論から言うと約200%早くなった
いきなりベンチ結果です。
EC-CUBE Ver.3.0.11で追加されたDoctrine CacheとHTTP Cacheとは?
EC-CUBE3を開発するにあたり、コミッターで色々な議論がされました。その時に僕はパフォーマンス向上とデータ構造の柔軟性を強く訴え、concrete5を参考にしたEAVのサンプルコード*1とかも出していたのですが、「いきなりテーブル構造を大幅に変えるのはちょっと...」とか「EAVはちょっと...」という事でお蔵入りになってしまいました。
とりあえず2系の基本機能を新しいアーキテクチャで実装するという方針で、Ver.3.0.0は開発され、リリースされましたが、リリース直後から「もっさりしてる」「重い」という意見が多く、高速化作業が進んでいました。
その後3.0.11でパフォーマンス改善のために導入されたのがこのDoctrine CacheとHTTP Cacheになります。
Doctrine Cacheとは?
EC-CUBE3ではデータベース等のアクセスにDoctrineという実績豊富なライブラリを利用しています。開発をしやすくしてくれる便利ライブラリですが、こいつが重い!
そこでデータベースからのレスポンスやデータ構造の設定などをキャッシュしておく仕組みがこのDoctrine Cacheです。
HTTP Cacheとは?
EC-CUBE3ではフレームワークとしてSilexを利用しています。
Silexでは他のsymfony系のフレームワーク同様に、symfonyコンポーネントを元にしており、symfonyの多くの機能を利用できます。
このHTTP Cacheはそんなsymfonyの機能のひとつで、いわゆるリバースプロキシです。
プログラムの実行結果としてのWebページをキャッシュしておいて、コントローラに処理が渡る前にキャッシュからレスポンスを返します。
単純なリバースプロキシであればPHPで実装されたこのHTTP Cacheよりも、Nginxのリバースプロキシやfast-cgiのキャッシュの方が高速に動作しますが、EC-CUBEで構築するネットショップではログインボックスやカート画面など、単純なリバースプロキシでは困る事が多々あります。
このHTTP Cacheの素晴らしい点は、EC-CUBEのブロック単位でキャッシュするしないの設定が可能な事です。これにより常に動的に動作して欲しいブロックや画面はHTTP Cacheを無効にする事ができます。
キャッシュの設定方法
さて、では早速Doctrine CacheとHTTP Cacheを設定してみましょう。
これらの設定にはYAML形式の設定ファイルを利用します。*2
設定ファイルは、 /app/config/eccube 配下に、
- doctrine_cache.yml
- http_cache.yml
という名前で作成します。
これらのファイルの雛形が、/src/Resource/config 内にあるので、これをコピーしてきて作ると楽チンです。
では、次にそれぞれの設定ファイルの中身と設定項目です。
Doctrine Cache
Doctrine Cacheの設定ファイル、doctrine_cache.ymlでは以下の項目が設定できます。
- metadata_cache
- query_cache
- DoctrineがDBに投げるSQLクエリをキャッシュします
- result_cache
- DoctrineがDBから受け取る結果セットをキャッシュします
- hydration_cache
- 連想配列から、 Entity への変換結果をキャッシュします
設定はキャッシュドライバを指定するとこから始まります。
標準ではaray(PHPの配列)となっていますが、filesystem、apc、redis、xcache、memcached、memcache、が利用できます。
APCかAPCuが入っているなら、apcで良いと思います。OSやサーバ環境によってはfilesystemが速かったりするので、試してみてください。
apc,array以外の場合は、pathやhostなどキャッシュストアにアクセスするための情報が必要です。
以下が今回僕が設定したファイルの内容です。
doctrine_cache: metadata_cache: driver: apc path: host: port: password: query_cache: driver: apc path: host: port: password: result_cache: driver: apc path: host: port: password: lifetime: 3600 clear_cache: true hydration_cache: driver: apc path: host: port: password:
HTTP Cache
HTTP Cacheの設定ファイル、http_cache.ymlでは以下の項目が設定できます。
- enabled
- httpキャッシュの有効無効を設定します。デフォルトは無効
- age
- キャッシュの有効時間です。標準は10
- route
- フロントでキャッシュさせる画面のRouteです。
ブロックの場合は「block_xxx」形式で書きます。1route1行です。
- フロントでキャッシュさせる画面のRouteです。
以下が今回設定した内容です。
http_cache: enabled: true age: 10 route: - homepage - product_list - block_category - block_news - block_search_product - block_garally - block_free - block_new_product - block_footer - block_logo - help_about - help_guide - help_privacy - help_tradelaw - help_agreement
詳しくは、EC-CUBE公式のドキュメントサイトにも記述がありますので、確認してください。
さらに高速化するためには
実はEC-CUBE3でもっとも処理に時間がかかっているのは、テンプレートエンジンのTwigの処理です。
HTTP Cacheを利用していれば、基本的にTwigまで処理が回らずにページは表示されるのですが、キャッシュしてしまうと都合の良くないブロック(ログインブロックなど)アクセスの度に処理が走ります。
なので、このTwigのキャッシュのI/Oを速くすると速度向上が望めます。
また、PHP7は非常に高速なので、PHP7にする事でもパフォーマンスの改善が望めます。
それでもまだダメなら、
- DBの複数台構成化
- Readレプリカを作り、読み込みと書き込みでDBサーバを分ける
- 強力なサーバに乗り変える*3
- DBサーバ、Webサーバ、各種ミドルウェアのチューニング
- EC-CUBEのコードのチューニング
- テーブル構造とクエリの改修
- OSのチューニング
となり、最後はもう、サーバー数の力に頼る事になります。
クロスキューブではEC-CUBE3のバージョンアップ、チューニングを承っております!
最後に宣伝ですw
株式会社クロスキューブではインフラからフロントエンドまで、EC-CUBE3のパフォーマンス改善チューニングを行っています。
EC-CUBE3のチューニングには、一般的なサーバやネットワーク、ミドルウェアの知識やスキルだけでなく、PHPプログラミングやEC-CUBEの知識、スキルが必要になり、必要とされる知識やスキルが多岐にわたります。
株式会社クロスキューブではそういった様々な角度から状況を検証し、予算に合わせた最も費用対効果の高いチューニングサービスをご提案しています。
ネットショップの表示速度等のパフォーマンスは、如実にECサイトの売り上げに影響を与えますので、「EC-CUBEが重いな〜」と思ったらぜひお問い合わせください。
EC-CUBE3対応!デザインカスタマイズガイドブック
新しくなったEC-CUBE3に対応したデザインカスタマイズブック。2017年1月現在 EC-CUBE3のデザインカスタマイズについて解説されている書籍はこれだけです。とりあえず買いましょう!