MagentoのキャッシュにAPCを使う
この記事は公開から 1年以上が経過しています。現在の最新情報との整合性については弊社では一切の責任を負いかねます。
Magentoはシステム設定や、データモデル定義、ロケール、画面レイアウトといった様々なデータを都度都度処理しなくて済むように、キャッシュという中間データの形にして保存しています。
もしキャッシュのない状態でMagentoを運用すると、 1秒間に処理することのできるアクセス数は、キャッシュが有効である状態に比べて大幅に低下してしまいます。
そのため、Magentoで構築したサイトを本番運用するサーバでは、キャッシュを常に有効にしておくことが推奨されています。
このエントリでは、そのMagentoのキャッシュにPHPのバイトコードキャッシュである、APCを使う場合のメリットとデメリットについて説明します。
Magentoのキャッシュは標準ではファイルとして保存される
MagentoのキャッシュはZend FrameworkのZend_Cacheを土台に使用しています。
つまり、Zend_Cacheの仕様に準じた挙動を示す、ということになります。
Zend_Cacheは処理の開始時に、キャッシュの保存方法を指定するようになっているのですが、Magentoの標準はファイルとなっています。
この設定は app/etc/local.xml.additional にひな形が書かれています。
Magentoで利用できるキャッシュの保存方法
先ほどの local.xml.additional の定義によると、Magentoでは以下のキャッシュ保存方法が利用できます。
- APC
- memcached
- xCache
- file
APCとxCacheはPHPのバイトコードキャッシュと呼ばれる拡張機能で、PHPのプログラムをコンピュータが実行しやすい形式に変換して保存・再利用することを目的としています。
これらは一時データであるキャッシュにも利用することができるため、Zend_Cacheの保存先として利用可能です。
memcachedは近年脚光を浴びているNoSQL(Key-Value-Storage/キーバリューストレージ)の一種で、サーバのメモリ上にキー値とその対になるデータを保管するシステムです。
最大の特徴は、メモリ上にデータを保存するために、ハードディスクやSSDにデータを書き込む必要がなく、その分だけ高速に動作することです。
Webアプリケーションの世界ではセッション情報の保存先や、一時データの保存先として利用されることが多く、Magentoでもセッション情報の保存先としても利用ができます。
標準ではこの4つの保存先が利用できますが、GitHubで公開されている、Cm_Cache_Backend_Redisを利用することで、RedisというNoSQLサーバをキャッシュの保存先に利用することができます。
APCをキャッシュの保存先に使うには
さて、APCをMagentoのキャッシュの保存先として利用するには、 app/etc/local.xml に以下のような定義を追加する必要があります。
apc Mage_
保存した後に、Magentoのキャッシュをクリアすると、これまでファイルシステムにキャッシュを保存していたものがAPCのキャッシュとして保存されるようになり、ファイルに保存していた時よりもシステムの性能が向上します。
APCをキャッシュに使用した場合
APCをキャッシュに使用することは良いことだけなのでしょうか?
以下にメリットとデメリットをまとめました。
導入の際の参考にしてください。
メリット
- サーバが1台の運用でも導入ができる
- PHPの高速化のためにインストールされていることがあるため、導入しやすい
- 設定が比較的容易で、多少性能が向上する
デメリット
- Magentoのキャッシュは数種類あり、その識別のためにタグという追加情報をキャッシュに付与しているが、APCやmemcachedにはタグという概念が存在しないので、特定のキャッシュだけを更新することができない
- APCの設定が不十分な場合、メモリ溢れによる誤動作が起きる
- エクステンションのインストール・アンインストールの際に、キャッシュを管理画面からでなければ更新できなくなる(更新用のツールを作成すればコマンドラインからも可能)
終わりに
MagentoのキャッシュにAPCを使う例は、「Magento APC cache」などで検索すると多数ヒットします。
ですが、メリットもある反面、デメリットもそれなりにあるため、本当にAPCで良いかどうかはよく検討する必要があります。
安易にAPCが簡単に導入できるから、という理由だけでファイルに保存していたキャッシュをAPCに移すことは危険なのでやめておいたほうが良いでしょう。