私はMemcachedをインストールしたばかりですが、Doctrine ORM(Doctrine 2.4.8+、Symfony 2.8+)で行われたさまざまなクエリの結果をキャッシュに使用しようとしています。
私app/config/config_prod.yml
は、この持っている:Doctrine Memcachedを使用した結果キャッシング
doctrine:
orm:
metadata_cache_driver: memcached
result_cache_driver: memcached
query_cache_driver: memcached
を、私はそのような2つのクエリ(私は、たとえばここでキャッシュIDを置き換え)にuseResultCache()
に試してみました:return $query->useResultCache(true, 300, "my_cache_id")->getArrayResult();
。複雑なためにネイティブクエリ(SQL)なので特別なクエリがここにありますが、このメソッドはどのクエリ(class AbstractQuery)でも利用できるので、動作するはずです。
残念ながら、それはありません。たびに私はページをリフレッシュし、ちょうどデータベースで変更を行った場合、変更が表示されます。私はmemcachedの統計をチェックしましたが、それでもキャッシュヒットがあるようですが、どういうことが本当にわかりません。私はちょうど言った。
誰かが、ここでキャッシュを使用してキャッシュされた結果が得られないように見える理由を知っていますか?私は何かを誤解し、TTLは何とか無視されましたか?
エラーは発生しません。memcachedログは空です。
が、ここでは2つのネイティブクエリを作成するために私のコードのレイアウトは、私が上でMemcachedのテストを入れている:だから
$rsm = new ResultSetMapping;
$rsm->addEntityResult('my_entity_user', 'u');
// some $rsm->addFieldResult('u', 'column', 'field');
// some $rsm->addScalarResult('column', 'alias');
$sqlQuery = 'SELECT
...
FROM ...
INNER JOIN ... ON ...
INNER JOIN ... ON ...
// some more join
WHERE condition1
AND condition2';
// some conditions added depending on params passed to this function
$sqlQuery .= '
AND (fieldX = (subrequest1))
AND (fieldY = (subrequest2))
AND condition3
AND condition4
GROUP BY ...
ORDER BY ...
LIMIT :nbPerPage
OFFSET :offset
';
$query =
$this->_em->createNativeQuery($sqlQuery, $rsm)
// some ->setParameter('param', value)
;
return $query->useResultCache(true, 300, "my_cache_id")->getArrayResult();
興味深い質問です。キャッシュドライバとしてapcに切り替える(戻る)ことは何か違いはありますか? – mblaettermann
@mblaettermannデフォルトでは、実際にはapcでコメントされています。そして、期待通りに私はapcを設定した場合、この例外を直接取得します: 'Symfony \ Component \ Debug \ Exception \ UndefinedFunctionException名前空間" Doctrine \ Common \ Cache "から関数" apc_fetch "を呼び出そうとしました。 – Harest
ああ、大丈夫です。 APCu PHPエクステンションが見当たりません。それが他の結果をもたらすのであれば私はちょうど興味がありました。もしあなたがシステムを変更できるなら、 'apt-get install php5-apcu'でインストールすることができます。 – mblaettermann