2つの異なるアクションで同じクエリをキャッシュしようとしましたが、同じキャッシュされたオブジェクトが使用されます。アプリケーションの構成ファイルでCProfileLogRoute
を有効にすることがわかります。
CActiveRecord
クラスのソースコードを見ると、public function findByPk($pk,$condition='',$params=array())
メソッド(および他のクエリメソッド)はprotected function query($criteria,$all=false)
を使用しています。これは、最後にprivate function queryInternal($method,$mode,$params=array())
のCDbCommand
クラスに依存しています。ここでYiiはデータベースクエリでキャッシュ処理を行います。次のように
1クエリ結果を保存し、復元するために使用されるキャッシュのキーを見ることができるように定義されます。
$cacheKey='yii:dbquery'.$this->_connection->connectionString.':'.$this->_connection->username;
$cacheKey.=':'.$this->getText().':'.serialize(array_merge($this->_paramLog,$params));
if(($result=$cache->get($cacheKey))!==false)
{
Yii::trace('Query result found in cache','system.db.CDbCommand');
return $result;
}
このキーを考慮にキャッシュ依存関係インスタンスを負いません。 CDbCacheDependency
は、データベース内で何かが変更されたかどうかを判断するためにのみ使用され、キャッシュを更新するために新しいクエリが実行されます。より多くを語るには - あなたは、クエリの結果に沿って直列にキャッシュされるため、CDbCacheDependency
のインスタンスに時間をキャッシュ中に意味を行います2つのアクションそれらの一つだけ(最初に実行)でCDbCacheDependency
を作成するために、別のSQLを指定した場合:
if(isset($cache,$cacheKey))
$cache->set($cacheKey, $result, $this->_connection->queryCachingDuration, $this->_connection->queryCachingDependency);
評価した依存関係のインスタンスをキャッシュすることはCCache
クラスのpublic function set($id,$value,$expire=0,$dependency=null)
方法で見ることができます。
if ($dependency !== null && $this->serializer !== false)
$dependency->evaluateDependency();
if ($this->serializer === null)
$value = serialize(array($value,$dependency));
elseif ($this->serializer !== false)
$value = call_user_func($this->serializer[0], array($value,$dependency));
うわー!このレベルの詳細は期待していませんでした。ありがとう!そのほとんどは理にかなっています。私はこの行について混乱しています: "CDbCacheDependencyを2つのアクションで作成するために異なるSQLを指定した場合、CDbCacheDependencyのインスタンスがクエリの結果と共にキャッシュされるため、キャッシング中にそのうちの1つ(最初に実行される)依存関係のインスタンスがキャッシュされ再利用されていると言っていますか? – HyderA
はい、私はこれを正確に意味しました。依存関係のインスタンスは値とともにキャッシュされ、次回、 'if(($ result = $ cache-> get($ cacheKey))!== false)'条件でキャッシュ値を取り出すと、このインスタンスは依存関係のクエリを実行しているデータベースで何らかの変更が発生したかどうかを判断し、前に評価された結果と比較します(キャッシュ値が設定されたとき)。アプリケーションの設定の 'log'コンポーネントに' CProfileLogRoute'を追加し、 'db'コンポーネントの' enableProfile'フラグを 'true'に設定することでそれをテストすることができます。 – Ezze