MagentoのBlockはキャッシュできる基礎構造を持っています。
ですが、明示的に指定されない限りキャッシュしないようになっています。

Magentoは標準では動作が軽いシステムではないので、少しでもレスポンスを向上させたいと思う場合は、Blockの適切なキャッシュ化が必要になります。

このエントリではどのようにBlockをキャッシュするかを解説し、その効果的な利用方法についても説明します。

Mage_Core_Block_Abstract にはキャッシュするための処理が書かれている

まず最初に知っておかなければならないのですが、全てのBlockの基底クラスになっている、Mage_Core_Block_Abstract には、「getCacheTags」と「getCacheLifetime」というメソッドが用意されています。
そして、HTMLを出力する「toHtml」の中で、キャッシュの存在チェックや更新処理を行っています。 

ですから、全てのBlockオブジェクトは、その出力をキャッシュできる能力を潜在的に持っているわけです。

ほとんどのBlockはその出力をキャッシュしていない

ところが、大半のBlockはその出力データをキャッシュしていないという事実があります。
ごく一部のBlockと、ウィジェットによるBlock出力だけが、キャッシュへのデータ保存を行っています。
(あくまで標準の、という話です。サードパーティ製のエクステンションではきちんと考慮されている場合もあります) 

そのため、Magento Community Editionの標準状態ではBlockのHTML出力を行うために、非常に多くのデータベース問い合わせが行われます。当然、PHPによる処理も行われるため、処理効率の良くない状態になっています。

Magento Enterprise Editionでは、フルページキャッシュ機能によって、キャッシュするブロックとそうでないブロックをきりわけて、ページあたりの処理量を減らしています。

Blockをキャッシュするには

Blockをキャッシュするには、「setCacheLifetime」メソッドを呼び出して、キャッシュの有効期間を引数に指定します。
このメソッドはレイアウトXMLからも呼び出すことができます(どう定義すればいいかは「MagentoのレイアウトXMLを知る〜actionタグ〜」を参考にしてください)。

また、Block自体をカスタムでPHPコードから定義する場合は、コンストラクタで「setCacheLifetime」を呼び出せばよいでしょう。 

Blockをキャッシュするメリット

Blockをキャッシュするメリットは以下のとおりです。

  • データベース問い合わせの回数を減らすことができる
  • HTML出力の生成までにかかるCPU負荷や演算量を減らすことができる
  • ページ全体のレスポンスが少しずつでも速くなるので、サーバの性能をより効率良く使うことができる

反対にデメリットは以下のとおりです。

  • 明示的にキャッシュを更新しなければ、データベースを更新しても画面が変わらなくなる
  • キャッシュがある状態とない状態で、レスポンスがあまりに差がでてしまう場合、キャッシュの更新時にサイトが過不可になりやすくなる
  • キャッシュの読み書きに際し、キャッシュの保存先に対する読み書きの負荷がかかる
基本的にはキャッシュするほうがメリットが大きく、運用の手順として、Block出力に関わることを更新した場合はキャッシュを更新するようにしておけば問題はありません。

キャッシュして良いBlock・良くないBlock

さて、最後にキャッシュして良いBlockと良くないBlockについて考えます。

一般的にキャッシュして良いBlockは以下のようなものです。

  • バナーや純粋なHTMLパーツを出力するもの

反対にキャッシュしてはいけないBlockは以下のとおりです。

  • 個人情報を含んでいるもの

バナーやHTMLだけでできたパーツ(例えば新着商品リストなど)は、サイトにもよりますがリアルタイム性はそこまで要求されません。
また、個人情報を含むわけではないので、キャッシュしたほうが良いものになります。 
あとは商品リストや、各種説明コンテンツページのHTMLなどはキャッシュして良いでしょう。

反対に、個人情報を含むBlockは絶対にキャッシュしてはいけません。
アクセスしてきた個人を厳格に識別できるのであれば問題はありませんが、そうでないのであれば、マイページや購入画面などはキャッシュしてはいけません(至極当たり前ですが)。 

終わりに

Magentoはどうしても豊富な機能と引き換えに、レスポンスが低下しがちです。
キャッシュを有効に活用し、良好なレスポンスを維持していくことがサイト運営やカスタマイズの上では重要になります。