Вход Регистрация
Файл: framework/base/CStatePersister.php
Строк: 196
<?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()}.
 *
 * @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);
            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);
    }
}
Онлайн: 2
Реклама