CStatePersister


system.base
继承 class CStatePersister » CApplicationComponent » CComponent
实现 IApplicationComponent, IStatePersister
源自 1.0
版本 $Id: CStatePersister.php 3515 2011-12-28 12:29:24Z mdomba $
源码
CStatePersister实现一个基于文件的持久数据存储。

它可以用来保持多个请求或会话的数据。

默认, CStatePersister存储数据在一个名字叫‘state.bin’文件中它位于应用程序指定的 runtime 路径下。 你可以通过设置stateFile属性来改变它的位置。

从CStatePersister调用数据使用load()。保存数据使用 save().

持久数据,会话和缓存之间的比较如下:
  • session:单个用户的会话持久数据.
  • state persister:所有请求的/会话的持久数据(例如,点击统计)。
  • cache:不稳定并快速的储诸。它可的使用介于会话和持久数据之间。


因为服务器的资源通常有限, 如果你计划使用CStatePersister存储大量的数据。 你应该考虑使用吞吐性高的 基于数据的持久存储。

CStatePersister是一个核心的应用组件,用于存储全局的应用程序状态。 你也可以通过访问CApplication::getStatePersister() 了解基于缓存的页面持久存储。

公共属性

属性 类型 描述 定义在
behaviors array 这个应用组件附加的行为。 这此行为将在应用组件调用init时附加在应用组件上。 请参照CModel::behaviors如何指定此属性值。 CApplicationComponent
cacheID string 这个ID指定的是缓存应用组件,用于缓存应用程序状态数据。 默认是‘cache’指的是主缓存应用组件。 设置这个属性为false,将禁止缓存应用程序状态数据。 CStatePersister
isInitialized boolean 检查应用组件是否已经初始化。 CApplicationComponent
stateFile string 存储数据的文件路径。 请确保目录存在这个文件并且Web服务器进程对这个它具有可写权限请确保目录存在这个文件并且Web服务器进程对这个它具有可写权限。 如果使用相对路径,请确保路径是正确的。 CStatePersister

公共方法

方法 描述 定义在
__call() 如果类中没有调的方法名,则调用这个方法。 CComponent
__get() 返回一个属性值、一个事件处理程序列表或一个行为名称。 CComponent
__isset() 检查一个属性是否为null。 CComponent
__set() 设置一个组件的属性值。 CComponent
__unset() 设置一个组件的属性为null。 CComponent
asa() 返回这个名字的行为对象。 CComponent
attachBehavior() 附加一个行为到组件。 CComponent
attachBehaviors() 附加一个行为列表到组件。 CComponent
attachEventHandler() 为事件附加一个事件处理程序。 CComponent
canGetProperty() 确定属性是否可读。 CComponent
canSetProperty() 确定属性是否可写。 CComponent
detachBehavior() 从组件中分离一个行为。 CComponent
detachBehaviors() 从组件中分离所有行为。 CComponent
detachEventHandler() 分离一个存在的事件处理程序。 CComponent
disableBehavior() 禁用一个附加行为。 CComponent
disableBehaviors() 禁用组件附加的所有行为。 CComponent
enableBehavior() 启用一个附加行为。 CComponent
enableBehaviors() 启用组件附加的所有行为。 CComponent
evaluateExpression() 计算一个PHP表达式,或根据组件上下文执行回调。 CComponent
getEventHandlers() 返回一个事件的附加处理程序列表。 CComponent
getIsInitialized() 检查应用组件是否已经初始化。 CApplicationComponent
hasEvent() 确定一个事件是否定义。 CComponent
hasEventHandler() 检查事件是否有附加的处理程序。 CComponent
hasProperty() 确定属性是否被定义。 CComponent
init() 初始化这个组件。 CStatePersister
load() 从持久存储加载状态数据。 CStatePersister
raiseEvent() 发起一个事件。 CComponent
save() 保存应用程序状态到持久存储。 CStatePersister

属性详细

cacheID 属性
public string $cacheID;

这个ID指定的是缓存应用组件,用于缓存应用程序状态数据。 默认是‘cache’指的是主缓存应用组件。 设置这个属性为false,将禁止缓存应用程序状态数据。

stateFile 属性
public string $stateFile;

存储数据的文件路径。 请确保目录存在这个文件并且Web服务器进程对这个它具有可写权限请确保目录存在这个文件并且Web服务器进程对这个它具有可写权限。 如果使用相对路径,请确保路径是正确的。

方法详细

init() 方法
public void init()
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)));
}

初始化这个组件。 这个方法重载了父类的实现,添加了一个stateFile 的有效值。

load() 方法
public mixed load()
{return} mixed 状态数据,如果状态数据不可用返回null。
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;
}

从持久存储加载状态数据。

save() 方法
public void save(mixed $state)
$state mixed 状态数据(必须是序例化的)。
public function save($state)
{
    
file_put_contents($this->stateFile,serialize($state),LOCK_EX);
}

保存应用程序状态到持久存储。