Symfony2のアプリで外部から取得したデータやパースしたデータをちょっとキャッシュしたい時に便利なのがDoctrineCacheBundleです。
インストール
DoctrineCacheBundleが依存するDoctrine\Common\Cache(DoctrineのCacheコンポーネント)はSymfony standard editionで、ORMとしてDoctrine2を利用している場合は既に含まれており、外部ライブラリを追加する必要はありません。
composerでdoctrine/doctrine-cache-bundleへの依存を追加し、
$ composer require doctrine/doctrine-cache-bundle ~1.0
AppKernel.phpでDoctrineCacheBundleをバンドルとして追加したら
<?php
$bundles = array(
// ...
new Doctrine\Bundle\DoctrineCacheBundle\DoctrineCacheBundle(),
);
準備完了です。
設定
app/config.yml
doctrine_cache:
providers:
hoge_foo_bar_cache: #自分でつけた名前
type: apc #実際にキャッシュを何に保存するか
キャッシュの保存先は
- apc
- array(テスト時など、一回の実行中のみ保持したい場合)
- Couchbase
- file
- filesystem
- memcache
- memcached
- MongoDB
- phpfile
- redis
- riak
- wincache
- xcache
- ZendDataCache
から好きなものを選ぶことができます。 オプションとして各保存先ごとの設定が必要です(memcacheの接続先など。設定例)
使い方
キャッシュのインスタンスを取得する
コンテナから直接取得する場合(あんまりお勧めしない設計…)は
<?php
$cache = $container->get('doctrine_cache.providers.hoge_foo_bar_cache');
SymfonyのDIにインジェクトさせる場合は
services:
myapp.hoge.foo_bar_service:
class: MyApp\HogeBundle\Service\FooBarService
arguments:
- @doctrine_cache.providers.hoge_foo_bar_cache
インスタンスは doctrine_cache.providers.自分で設定した名前
という名前でコンテナから取得できます。
このインスタンスを使ってキャッシュを操作できます。
foo
という識別名のキャッシュが存在するかどうか確認する
<?php
$cache->contains('foo'); // true: キャッシュあり false: キャッシュなし
foo
という識別名のキャッシュを取得する
<?php
$cache->fetch('foo'); // fooとしてキャッシュされているデータ。文字列、数値、インスタンスなど。
foo
という識別名でキャッシュを保存する
<?php
$data = new SomeClass();
$cache->save('foo', $data); // fooとして$dataを永遠にキャッシュする
$data = 1;
$cache->save('bar', $data, 10); // barとして$dataを10秒間キャッシュする
クラスのインスタンスをキャッシュ保存する際、シリアライズ→デシリアライズは自動的に行われ、自前でシリアライズ処理をする必要はありません。
foo
という識別名のキャッシュを削除する
<?php
$cache->delete('foo');
現在保存されているすべてのキャッシュ内容を取得する
<?php
$cache->getStats(); // [bar => 1]