You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							113 lines
						
					
					
						
							3.3 KiB
						
					
					
				
			
		
		
	
	
							113 lines
						
					
					
						
							3.3 KiB
						
					
					
				<?php | 
						|
/** | 
						|
 * CCacheDependency class file. | 
						|
 * | 
						|
 * @author Qiang Xue <qiang.xue@gmail.com> | 
						|
 * @link http://www.yiiframework.com/ | 
						|
 * @copyright Copyright © 2008-2011 Yii Software LLC | 
						|
 * @license http://www.yiiframework.com/license/ | 
						|
 */ | 
						|
 | 
						|
/** | 
						|
 * CCacheDependency is the base class for cache dependency classes. | 
						|
 * | 
						|
 * CCacheDependency implements the {@link ICacheDependency} interface. | 
						|
 * Child classes should override its {@link generateDependentData} for | 
						|
 * actual dependency checking. | 
						|
 * | 
						|
 * @property boolean $hasChanged Whether the dependency has changed. | 
						|
 * @property mixed $dependentData The data used to determine if dependency has been changed. | 
						|
 * This data is available after {@link evaluateDependency} is called. | 
						|
 * | 
						|
 * @author Qiang Xue <qiang.xue@gmail.com> | 
						|
 * @version $Id$ | 
						|
 * @package system.caching.dependencies | 
						|
 * @since 1.0 | 
						|
 */ | 
						|
class CCacheDependency extends CComponent implements ICacheDependency | 
						|
{ | 
						|
	/** | 
						|
	 * @var boolean Whether this dependency is reusable or not. | 
						|
	 * If set to true, dependent data for this cache dependency will only be generated once per request. | 
						|
	 * You can then use the same cache dependency for multiple separate cache calls on the same page | 
						|
	 * without the overhead of re-evaluating the dependency each time. | 
						|
	 * Defaults to false; | 
						|
	 * @since 1.1.11 | 
						|
	 */ | 
						|
	public $reuseDependentData=false; | 
						|
 | 
						|
	/** | 
						|
	 * @var array cached data for reusable dependencies. | 
						|
	 * @since 1.1.11 | 
						|
	 */ | 
						|
	private static $_reusableData=array(); | 
						|
 | 
						|
	private $_hash; | 
						|
	private $_data; | 
						|
 | 
						|
	/** | 
						|
	 * Evaluates the dependency by generating and saving the data related with dependency. | 
						|
	 * This method is invoked by cache before writing data into it. | 
						|
	 */ | 
						|
	public function evaluateDependency() | 
						|
	{ | 
						|
		if ($this->reuseDependentData) | 
						|
		{ | 
						|
			$hash=$this->getHash(); | 
						|
			if (!isset(self::$_reusableData[$hash]['dependentData'])) | 
						|
				self::$_reusableData[$hash]['dependentData']=$this->generateDependentData(); | 
						|
			$this->_data=self::$_reusableData[$hash]['dependentData']; | 
						|
		} | 
						|
		else | 
						|
			$this->_data=$this->generateDependentData(); | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * @return boolean whether the dependency has changed. | 
						|
	 */ | 
						|
	public function getHasChanged() | 
						|
	{ | 
						|
		if ($this->reuseDependentData) | 
						|
		{ | 
						|
			$hash=$this->getHash(); | 
						|
			if (!isset(self::$_reusableData[$hash]['hasChanged'])) | 
						|
			{ | 
						|
				if (!isset(self::$_reusableData[$hash]['dependentData'])) | 
						|
					self::$_reusableData[$hash]['dependentData']=$this->generateDependentData(); | 
						|
				self::$_reusableData[$hash]['hasChanged']=self::$_reusableData[$hash]['dependentData']!=$this->_data; | 
						|
			} | 
						|
			return self::$_reusableData[$hash]['hasChanged']; | 
						|
		} | 
						|
		else | 
						|
			return $this->generateDependentData()!=$this->_data; | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * @return mixed the data used to determine if dependency has been changed. | 
						|
	 * This data is available after {@link evaluateDependency} is called. | 
						|
	 */ | 
						|
	public function getDependentData() | 
						|
	{ | 
						|
		return $this->_data; | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * Generates the data needed to determine if dependency has been changed. | 
						|
	 * Derived classes should override this method to generate actual dependent data. | 
						|
	 * @return mixed the data needed to determine if dependency has been changed. | 
						|
	 */ | 
						|
	protected function generateDependentData() | 
						|
	{ | 
						|
		return null; | 
						|
	} | 
						|
	/** | 
						|
	 * Generates a unique hash that identifies this cache dependency. | 
						|
	 * @return string the hash for this cache dependency | 
						|
	 */ | 
						|
	private function getHash() | 
						|
	{ | 
						|
		if($this->_hash===null) | 
						|
			$this->_hash=sha1(serialize($this)); | 
						|
		return $this->_hash; | 
						|
	} | 
						|
} |