2016-03-26 46 views
2

私は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ログは空です。

@nifrによって要求されたよう

が、ここでは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(); 
+0

興味深い質問です。キャッシュドライバとしてapcに切り替える(戻る)ことは何か違いはありますか? – mblaettermann

+0

@mblaettermannデフォルトでは、実際にはapcでコメントされています。そして、期待通りに私はapcを設定した場合、この例外を直接取得します: 'Symfony \ Component \ Debug \ Exception \ UndefinedFunctionException名前空間" Doctrine \ Common \ Cache "から関数" apc_fetch "を呼び出そうとしました。 – Harest

+0

ああ、大丈夫です。 APCu PHPエクステンションが見当たりません。それが他の結果をもたらすのであれば私はちょうど興味がありました。もしあなたがシステムを変更できるなら、 'apt-get install php5-apcu'でインストールすることができます。 – mblaettermann

答えて

1

、それはに成功していないいくつかの理由の教義のためのようですResultCacheDriverを取得します。私はuseResultCache()の前に設定しようとしましたが、Memcachedからの例外がありました:Error: Call to a member function get() on null

Memcached()を呼び出すことで、より直接的に行うことにしました。私は、私のニーズに応じて、コントローラやリポジトリでこのようなことをやろうと思う。いくつかのテストの後、それは完全に動作します。ここ
は、私は基本的に何をすべきかです:

$cacheHit = false; 
    $cacheId = md5("my_cache_id"); // Generate an hash for your cache id 
    // We check if Memcached exists, if it's not installed in dev environment for instance 
    if (class_exists('Memcached')) 
    { 
     $cache = new \Memcached(); 
     $cache->addServer('localhost', 11211); 
     $cacheContent = $cache->get($cacheId); 
     // We check if the content is already cached 
     if ($cacheContent != false) 
     { 
      // Content cached, that's a cache hit 
      $content = $cacheContent; 
      $cacheHit = true; 
     } 
    } 
    // No cache hit ? We do our stuff and set the cache content for future requests 
    if ($cacheHit == false) 
    { 
     // Do the stuff you want to cache here and put it in a variable, $content for instance 
     if (class_exists('Memcached') and $cacheHit == false) $cache->set($cacheId, $content, time() + 600); // Here cache will expire in 600 seconds 
    } 

私はおそらくサービスでこれをあげますよ。まだこの種のもののための "ベストプラクティス"は何であるかわからない。

編集:私はサービスをしました。しかし、それはネイティブsqlでのみ動作します...したがって、問題は未解決のままです。
Edit²:このnull問題(Memcachedが見つかりませんでした)に関する解決策を見つけました。コードのビット:

 $memcached = new \Memcached(); 
     $memcached->addServer('localhost', 11211); 
     $doctrineMemcached = new \Doctrine\Common\Cache\MemcachedCache(); 
     $doctrineMemcached->setMemcached($memcached); 
     $query 
      ->setResultCacheDriver($doctrineMemcached) 
      ->useResultCache(true, 300); 

今、私はちょうどuseResultCache()機能を使用するconfig_prod.ymlに置くべきもの知っていただきたいと思います。

関連する問題