मैंने दो अलग-अलग कार्रवाइयों में एक ही क्वेरी को कैश करने की कोशिश की और हां, उसी कैश किए गए ऑब्जेक्ट का उपयोग किया जाएगा। कोई भी देख सकता है कि एप्लिकेशन की कॉन्फ़िगरेशन फ़ाइल में 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));
वाह! इस स्तर के विस्तार की उम्मीद नहीं कर रहा था। धन्यवाद! इसमें से अधिकांश समझ में आता है। मैं इस पंक्ति के बारे में उलझन में हूं: "यदि आप दो क्रियाओं में सीडीबी कैश पर निर्भरता बनाने के लिए अलग-अलग एसक्यूएल निर्दिष्ट करते हैं तो उनमें से केवल एक (पहले निष्पादित) सीडीबी कैश के उदाहरण के कारण कैशिंग समय के दौरान समझ में आता है, क्वेरी के परिणाम के साथ क्रमबद्ध क्रमबद्ध होता है"। क्या आप कहने का मतलब है कि निर्भरता उदाहरण कैश किया जा रहा है और पुन: उपयोग किया जा रहा है? – HyderA
हां, मेरा मतलब यह बिल्कुल था। निर्भरता उदाहरण मूल्य के साथ कैश किया जाएगा, और अगली बार जब कैश मान को 'if (($ result = $ cache-> get ($ cacheKey) प्राप्त करें) == false) 'इस स्थिति का उपयोग इस स्थिति का उपयोग किया जाएगा निर्धारित करें कि डाटाबेस निष्पादन निर्भरता के निष्पादन में कुछ बदलाव हुए हैं और परिणाम को तुलना में पहले मूल्यांकन किया गया है (जब कैश मान सेट किया गया था)। आप इसे 'crrofileLogRoute' को' कॉन्फ़िगरेशन 'के' लॉग' घटक 'में' crrofileLogRoute' 'जोड़कर और 'db' घटक के' enableProfile' ध्वज को' सत्य 'में सेट करके स्वयं परीक्षण कर सकते हैं। – Ezze