2012-11-04 20 views
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 ही कैश्ड वस्तु का पुन: उपयोग, या वे अपने स्वयं के कैश वस्तुओं पैदा करेगा?

उत्तर

5

मैंने दो अलग-अलग कार्रवाइयों में एक ही क्वेरी को कैश करने की कोशिश की और हां, उसी कैश किए गए ऑब्जेक्ट का उपयोग किया जाएगा। कोई भी देख सकता है कि एप्लिकेशन की कॉन्फ़िगरेशन फ़ाइल में CProfileLogRoute सक्षम करना।

CActiveRecord कक्षा के स्रोत कोड को देखते हुए मैंने कहा कि public function findByPk($pk,$condition='',$params=array()) विधि (और अन्य क्वेरी विधियां) protected function query($criteria,$all=false) का उपयोग करें। बदले में, यह CDbCommand वर्ग के private function queryInternal($method,$mode,$params=array()) पर निर्भर करता है जहां वाईआई डेटाबेस क्वेरी के साथ अपना कैशिंग कार्य करता है।

$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 के कहने की वजह से समय कैशिंग के दौरान कोई मतलब होगा में CDbCacheDependency बनाने के लिए क्वेरी के परिणाम के साथ धारावाहिक कैश किया गया है विभिन्न SQLs निर्दिष्ट करें:

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)); 
+0

वाह! इस स्तर के विस्तार की उम्मीद नहीं कर रहा था। धन्यवाद! इसमें से अधिकांश समझ में आता है। मैं इस पंक्ति के बारे में उलझन में हूं: "यदि आप दो क्रियाओं में सीडीबी कैश पर निर्भरता बनाने के लिए अलग-अलग एसक्यूएल निर्दिष्ट करते हैं तो उनमें से केवल एक (पहले निष्पादित) सीडीबी कैश के उदाहरण के कारण कैशिंग समय के दौरान समझ में आता है, क्वेरी के परिणाम के साथ क्रमबद्ध क्रमबद्ध होता है"। क्या आप कहने का मतलब है कि निर्भरता उदाहरण कैश किया जा रहा है और पुन: उपयोग किया जा रहा है? – HyderA

+0

हां, मेरा मतलब यह बिल्कुल था। निर्भरता उदाहरण मूल्य के साथ कैश किया जाएगा, और अगली बार जब कैश मान को 'if (($ result = $ cache-> get ($ cacheKey) प्राप्त करें) == false) 'इस स्थिति का उपयोग इस स्थिति का उपयोग किया जाएगा निर्धारित करें कि डाटाबेस निष्पादन निर्भरता के निष्पादन में कुछ बदलाव हुए हैं और परिणाम को तुलना में पहले मूल्यांकन किया गया है (जब कैश मान सेट किया गया था)। आप इसे 'crrofileLogRoute' को' कॉन्फ़िगरेशन 'के' लॉग' घटक 'में' crrofileLogRoute' 'जोड़कर और 'db' घटक के' enableProfile' ध्वज को' सत्य 'में सेट करके स्वयं परीक्षण कर सकते हैं। – Ezze