diff options
Diffstat (limited to 'framework/base/CStatePersister.php')
| -rw-r--r-- | framework/base/CStatePersister.php | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/framework/base/CStatePersister.php b/framework/base/CStatePersister.php new file mode 100644 index 0000000..5b9e134 --- /dev/null +++ b/framework/base/CStatePersister.php @@ -0,0 +1,108 @@ +<?php +/** + * This file contains classes implementing security manager feature. + * + * @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/ + */ + +/** + * CStatePersister implements a file-based persistent data storage. + * + * It can be used to keep data available through multiple requests and sessions. + * + * By default, CStatePersister stores data in a file named 'state.bin' that is located + * under the application {@link CApplication::getRuntimePath runtime path}. + * You may change the location by setting the {@link stateFile} property. + * + * To retrieve the data from CStatePersister, call {@link load()}. To save the data, + * call {@link save()}. + * + * Comparison among state persister, session and cache is as follows: + * <ul> + * <li>session: data persisting within a single user session.</li> + * <li>state persister: data persisting through all requests/sessions (e.g. hit counter).</li> + * <li>cache: volatile and fast storage. It may be used as storage medium for session or state persister.</li> + * </ul> + * + * Since server resource is often limited, be cautious if you plan to use CStatePersister + * to store large amount of data. You should also consider using database-based persister + * to improve the throughput. + * + * CStatePersister is a core application component used to store global application state. + * It may be accessed via {@link CApplication::getStatePersister()}. + * page state persistent method based on cache. + * + * @author Qiang Xue <qiang.xue@gmail.com> + * @version $Id: CStatePersister.php 3515 2011-12-28 12:29:24Z mdomba $ + * @package system.base + * @since 1.0 + */ +class CStatePersister extends CApplicationComponent implements IStatePersister +{ + /** + * @var string the file path storing the state data. Make sure the directory containing + * the file exists and is writable by the Web server process. If using relative path, also + * make sure the path is correct. + */ + public $stateFile; + /** + * @var string the ID of the cache application component that is used to cache the state values. + * Defaults to 'cache' which refers to the primary cache application component. + * Set this property to false if you want to disable caching state values. + */ + public $cacheID='cache'; + + /** + * Initializes the component. + * This method overrides the parent implementation by making sure {@link stateFile} + * contains valid value. + */ + public function init() + { + parent::init(); + if($this->stateFile===null) + $this->stateFile=Yii::app()->getRuntimePath().DIRECTORY_SEPARATOR.'state.bin'; + $dir=dirname($this->stateFile); + if(!is_dir($dir) || !is_writable($dir)) + throw new CException(Yii::t('yii','Unable to create application state file "{file}". Make sure the directory containing the file exists and is writable by the Web server process.', + array('{file}'=>$this->stateFile))); + } + + /** + * Loads state data from persistent storage. + * @return mixed state data. Null if no state data available. + */ + public function load() + { + $stateFile=$this->stateFile; + if($this->cacheID!==false && ($cache=Yii::app()->getComponent($this->cacheID))!==null) + { + $cacheKey='Yii.CStatePersister.'.$stateFile; + if(($value=$cache->get($cacheKey))!==false) + return unserialize($value); + else if(($content=@file_get_contents($stateFile))!==false) + { + $cache->set($cacheKey,$content,0,new CFileCacheDependency($stateFile)); + return unserialize($content); + } + else + return null; + } + else if(($content=@file_get_contents($stateFile))!==false) + return unserialize($content); + else + return null; + } + + /** + * Saves application state in persistent storage. + * @param mixed $state state data (must be serializable). + */ + public function save($state) + { + file_put_contents($this->stateFile,serialize($state),LOCK_EX); + } +} |
