同じクエリを 2 つの異なるアクションでキャッシュしようとしましたが、キャッシュされた同じオブジェクトが使用されます。CProfileLogRoute
アプリケーションの構成ファイルで有効になっていることがわかります。
クラスのソース コードを見て、メソッド (およびその他のクエリ メソッド) が を使用するとCActiveRecord
述べました。これは最終的にofクラスに依存し、Yii はキャッシュをデータベース クエリで動作させます。public function findByPk($pk,$condition='',$params=array())
protected function query($criteria,$all=false)
private function queryInternal($method,$mode,$params=array())
CDbCommand
ご覧のとおり、クエリの結果を保存および復元するために使用されるキャッシュ キーは次のように定義されます。
$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
データベースで何かが変更されたかどうかを判断するためにのみ使用され、キャッシュを更新するために新しいクエリが実行されます。さらに言えば、2 つのアクションで異なる SQL を作成するように指定した場合、クエリの結果とともにシリアル化されCDbCacheDependency
たインスタンスがキャッシュされるため、そのうちの 1 つ (最初に実行される) のみがキャッシュ時間中に意味を持ちます。CDbCacheDependency
if(isset($cache,$cacheKey))
$cache->set($cacheKey, $result, $this->_connection->queryCachingDuration, $this->_connection->queryCachingDependency);
評価された依存関係のインスタンスのキャッシュは、クラスpublic function set($id,$value,$expire=0,$dependency=null)
のメソッドで確認できます。CCache
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));