123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- <?php
- /**
- * This file contains classes implementing security manager feature.
- *
- * @author Qiang Xue <qiang.xue@gmail.com>
- * @link http://www.yiiframework.com/
- * @copyright 2008-2013 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>
- * @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);
- elseif(($content=@file_get_contents($stateFile))!==false)
- {
- $cache->set($cacheKey,$content,0,new CFileCacheDependency($stateFile));
- return unserialize($content);
- }
- else
- return null;
- }
- elseif(($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);
- }
- }
|