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]