Magentoで大量の商品を扱う
Magento CE 1.xでは、1万SKUを超える商品数を扱うことができます。 非常に多くの商品バリエーションがあるようなサイトを構築することができるのはMagentoの魅力の一つです。 しかし、 Magento CE 1.xで1万件以上の商品を扱うときには注意が必要です。 商品数が少ない状況では上手く動いているように見えるような場合でも商品数が増えてくると速度の低下が発生してしまう場合があります。
以前、Magmiを使ってMagentoに大量商品を高速に商品インポートについてお話しましたが、今回は、無料のエクステンションを使った商品一覧、商品詳細のフルページキャッシングを用いて、Magentoの商品表示性能を底上げし、大量商品を扱うための下地を作る方法についてご紹介します。
Magentoでは、商品数が増えてくると、商品一覧ページなどの表示がだんだん遅くなってきます。
商品数が増えたらサーバのスペックをあげて遅さを解消するという方法もとれるのですが、その前にまだためしていないのであれば、導入を検討したほうがよいものの一つにフルページキャッシュという手法があります。
フルページキャッシュとは?
ブラウザキャッシュという言葉を聞いたことがあるでしょうか?ブラウザキャッシュは一度表示したページをブラウザ側に保存しておいて再表示をするときに、ネットからページをダウンロードするかわりに、保存しておいたキャッシュからページを再表示して表示を高速化する手法で、最近のブラウザであれば一般的にこの手法をつかって高速化されています。
フルページキャッシュも似たようなことをしますが、ブラウザではなくMagentoの動作しているサーバ側で行います。 Magentoがページを表示する場合、データベースからページに必要な情報を集めてきます。 たとえば、商品一覧ページであれば、Tシャツの商品一覧に所属している商品の、名前、価格、SKU、商品画像のパス、商品説明などを取得します。 そして取得したデータを、表示できるようなHTMLに組み立てて返します。 このデータベースからのデータの取得や、計算、HTMLの組み立てにはそれなりの計算パワーを使います。
そこで、フルページキャッシュでは一度、組み立てたHTMLを保存しておき、次に同じページを表示する必要がある場合には、保存しておいたHTML(フルページキャッシュ)を代わりに返してあげることで、データベースからのデータの取得や、計算、HTMLの組み立ての計算パワーを使わずにすむというものになります。
ブラウザキャッシュは、アクセスした個々のブラウザで行うので、一度もアクセスしたことがない人のブラウザではキャッシュの恩恵をうけることはできません。フルページキャッシングであれば、一度もアクセスしたことがない人でも、すでに別の誰かが同じページにアクセスしてキャッシュができていれば、キャッシュによる高速化の恩恵を受けることができます。

キャッシュ方式比較
フルページキャッシュをする方法
残念ながらMagento CE 1.xは標準ではフルページキャッシュの機能を備えていません。(Magento EEであれば標準でフルページキャッシングができます) したがって、カスタマイズをするか、エクステンションを調達してインストールする必要があります。いろいろ有償のエクステンションもありますが、なんと無償のエクステンションもあります。 今回は、無料のエクステンション Lesti_FPCをつかって性能を測定してみようと思います。
Lesti_Fpcのフルページキャッシュは、フルページキャッシュではない?
さて、タイトルを読まれて何を行っているんだと思った方もいらっしゃるかもしれませんが、 フルページキャッシングという言葉のイメージを素直に受け取ると、1ページ分まるっとHTMLをキャッシュしておくと想像しがちです。 しかし、Lesti_FPCではそのような動きはしません。 その代わりに、Magentoのビューの要素であるとブロックという単位でわけてページ毎にキャッシュを取っています。

Lesti_FPCのキャッシュする単位はブロック
なぜこのような仕組みになっているのでしょうか。 実はキャッシュの再利用性を考えてこのような仕組みになっています。 キャッシュは、一度作ったら、それをキャッシュとして利用できなければ意味がありません。 例えば、Magentoで顧客がログインするとページのヘッダ部に、ログインしている人の名前がでます。もし、ページを丸ごとキャッシュしてしまったら、そのユーザとは違う人に、そのままそのキャッシュ結果を返すわけにはいかないのです。(別人のログイン名がでたら問題になりますよね。)
そこで、Lesti_FPCでは、ブロック単位でキャッシュを行い、かつ、キャッシュをおこなわないブロックを指定できるようになっています。キャッシュを行わないブロックのみ毎回、生成する処理が実行されます。こうすることで、条件によって変わる部分は毎回生成、それ以外はキャッシュを使うという仕組みを実現できます。

Lesti_FPCでは、キャッシュしないブロックを制御
Lesti_FPCでは
- キャッシュしないブロック(主に2回以上表示することがないブロック)
- ユーザ毎に表示がかわるブロック
がデフォルトで指定されていて、カスタマイズされることを想定しており、管理画面から対象ブロックを変更することができます。
その他にも
- フルページキャッシングをする画面を指定する機能(通常は、商品詳細ページ、カテゴリページ、CMSページのみをフルページキャッシングする)
- URL、ポート、店舗、通貨、顧客グループ、テーマ毎に、同じURLでも別物としてキャッシュする機能
- ある特定のアクションが発動したらキャッシュをクリアする機能(例えば、カートに商品を追加するボタンをクリックした時など)
- URIパラメータ毎に別物としてキャッシュする機能
- カテゴリページで、ページングがある場合やソート順がある場合にデフォルトの1ページ目のみキャッシュする機能
などなど、Magentoでフルページキャッシングをしようと思うと、扱いを考えなければいけないようなものも、非常によく考えられて最初から作られています。これが無償で提供されているのですから驚きです。
フルページキャッシュの性能測定
それではフルページキャッシュを使う場合と使わない場合の速度を比較してみたいと思います。
まずは、測定条件についてご説明します。
測定条件
- 測定環境
下記の図が今回測定に利用した環境です。

測定したサーバの構成
フルページキャッシュでは、キャッシュを保存するためにRedisというストレージを使っています。それ以外は全く同じ構成です。
- 利用したソフトウェアのバージョン
ソフトウェア | バージョン |
---|---|
Magento | Magento CE 1.9.2.4 カスタマイズあり |
Lesti_FPC | 1.4.5 |
Apache | 2.4 |
PHP | 5.6 |
MySQL | 5.6 |
Redis | 2.8 |
- データ登録数
データの種類 | 件数 |
---|---|
CMSページ | 24 |
商品 | 53061 |
カテゴリ | 50 |
測定結果
それでは結果です。
ページの種類 | フルページキャッシュなし a[リクエスト/秒] | フルページキャッシュあり b[リクエスト/秒] | 倍率 b/a [-] |
---|---|---|---|
カテゴリページ | 8.55 | 17.34 | 2.0 |
商品詳細ページ | 8.36 | 22.46 | 2.7 |
トップページ | 0.68 | 18.78 | 27.6 |
カテゴリページや商品詳細ページで2倍から2.7倍の性能がでました。
フルページキャッシュを使うことで、MySQL DBのアクセスが減り、またページを組み立てる処理が軽減されるため、性能が向上したと考えられます。この余裕が出た分、たくさんのリクエストを処理できるようになったと考えられます。また、この余裕は商品数やカテゴリ数が増えたときに、増えた事によるMySQL DBからのデータ検索時間の増加を押さえる効果がありますので、商品数が増えたことによる速度低下もより押さえられます。
また、一緒に測定したトップページについては劇的に速度が向上しています。 トップページはCMSページで実現されていますが、トップページには商品やニュースなどさまざまな情報を表示しますので速度が低下しがちですがフルページキャッシュをつかうことで改善できているようです。
単純に2倍の性能を出そうとすると2倍のスペックのサーバか、2倍の数のサーバが必要だと考えられますが、今回はサーバとしては1台を追加しているだけですので、費用対効果も単純なサーバのスペックアップよりもよいでしょう。
まとめ
- フルページキャッシュとは、Magentoの動作しているサーバ側で、一度表示したページをキャッシュしておき、再表示を高速化する技術。
- Lesti_FPCでは、ページをブロックという単位を保持したままキャッシュしているので、再利用性が向上している。
- Lesti_FPCでは、キャッシュしてはいけないブロックを指定することができる。
- Lesti_FPCとRedisサーバを導入して、カテゴリページ、商品ページ、トップページの表示性能が向上した。それぞれ、2倍、2.7倍、27.6倍の性能となった。