5

例として、次のコードを取り上げます。

public function actionPostOneWay( $postId )
{
    $dependency = new CDbCacheDependency( 'SELECT publish_date FROM posts WHERE id = :post_id;' );
    $dependency->params = array( 'post_id'=>$postId );
    $post = Post::model()->cache( 59, $dependency )->findByPk( $postId );

    // process post one way
}

public function actionPostAnotherWay( $postId )
{
    $dependency = new CDbCacheDependency( 'SELECT publish_date FROM posts WHERE id = :post_id;' );
    $dependency->params = array( 'post_id'=>$postId );
    $post = Post::model()->cache( 59, $dependency )->findByPk( $postId );

    // process post another way
}

同じキャッシュされたオブジェクトにアクセス/postOneWayして/postAnotherWay再利用するのでしょうか、それとも独自のキャッシュ オブジェクトを作成するのでしょうか?

4

1 に答える 1

5

同じクエリを 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));
于 2012-11-04T19:33:00.613 に答える