芝麻web文件管理V1.00
编辑当前文件:/home2/sdektunc/yii/framework/base/CStatePersister.php
* @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: *
*
session: data persisting within a single user session.
*
state persister: data persisting through all requests/sessions (e.g. hit counter).
*
cache: volatile and fast storage. It may be used as storage medium for session or state persister.
*
* * 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()}. * * @author Qiang Xue
* @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=$this->getContent($stateFile))!==false) { $unserialized_content=unserialize($content); // If it can't be unserialized, don't cache it: if ($unserialized_content!==false || $content=="") $cache->set($cacheKey,$content,0,new CFileCacheDependency($stateFile)); return $unserialized_content; } else return null; } } elseif(($content=$this->getContent($stateFile))!==false) return unserialize($content); else return null; } /** * Loads content from file using a shared lock to avoid data corruption when reading * the file while it is being written by save() * * @param string $filename file name * @return bool|string file contents * @since 1.1.17 */ protected function getContent($filename) { $file=@fopen($filename,"r"); if($file && flock($file,LOCK_SH)) { $contents=@file_get_contents($filename); flock($file,LOCK_UN); fclose($file); return $contents; } return false; } /** * 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); } }