Sae.class.php 5.9 KB
Newer Older
章建武's avatar
章建武 committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
<?php
// +----------------------------------------------------------------------
// | TOPThink [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2013 http://topthink.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: luofei614 <weibo.com/luofei614>
// +----------------------------------------------------------------------
namespace Think\Storage\Driver;
use Think\Storage;
// SAE环境文件写入存储类
class Sae extends Storage{

    /**
     * 架构函数
     * @access public
     */
    private $mc;
    private $kvs        =   array();
    private $htmls      =   array();
    private $contents   =   array();
    public function __construct() {
        if(!function_exists('memcache_init')){
              header('Content-Type:text/html;charset=utf-8');
              exit('请在SAE平台上运行代码。');
        }
        $this->mc       =   @memcache_init();
        if(!$this->mc){
              header('Content-Type:text/html;charset=utf-8');
              exit('您未开通Memcache服务,请在SAE管理平台初始化Memcache服务');
        }
    }

    /**
     * 获得SaeKv对象
     */
    private function getKv(){
        static $kv;
        if(!$kv){
           $kv  =   new \SaeKV();
           if(!$kv->init())
               E('您没有初始化KVDB,请在SAE管理平台初始化KVDB服务');
        }
        return $kv;
    }


    /**
     * 文件内容读取
     * @access public
     * @param string $filename  文件名
     * @return string
     */
    public function read($filename,$type=''){
        switch(strtolower($type)){
            case 'f':       
                $kv     =   $this->getKv();
                if(!isset($this->kvs[$filename])){
                    $this->kvs[$filename]=$kv->get($filename);
                }
                return $this->kvs[$filename];
            default:
                return $this->get($filename,'content',$type);
        }        
    }

    /**
     * 文件写入
     * @access public
     * @param string $filename  文件名
     * @param string $content  文件内容
     * @return boolean
     */
    public function put($filename,$content,$type=''){
        switch(strtolower($type)){
            case 'f':       
                $kv         =   $this->getKv();
                $this->kvs[$filename] = $content;
                return $kv->set($filename,$content);
            case 'html':    
                $kv         =   $this->getKv();
                $content    =   time().$content;
                $this->htmls[$filename] =   $content;
                return $kv->set($filename,$content);
            default:
                $content    =   time().$content;
                if(!$this->mc->set($filename,$content,MEMCACHE_COMPRESSED,0)){
                    E(L('_STORAGE_WRITE_ERROR_').':'.$filename);
                }else{
                    $this->contents[$filename] = $content;
                    return true;
                }            
        }
    }

    /**
     * 文件追加写入
     * @access public
     * @param string $filename  文件名
     * @param string $content  追加的文件内容
     * @return boolean
     */
    public function append($filename,$content,$type=''){
        if($old_content = $this->read($filename,$type)){
            $content =  $old_content.$content;
        }
        return $this->put($filename,$content,$type);
    }

    /**
     * 加载文件
     * @access public
     * @param string $_filename  文件名
     * @param array $vars  传入变量
     * @return void
     */
    public function load($_filename,$vars=null){
        if(!is_null($vars))
            extract($vars, EXTR_OVERWRITE);
        eval('?>'.$this->read($_filename));
    }

    /**
     * 文件是否存在
     * @access public
     * @param string $filename  文件名
     * @return boolean
     */
    public function has($filename,$type=''){
        if($this->read($filename,$type)){
            return true;
        }else{
            return false;
        }
    }

    /**
     * 文件删除
     * @access public
     * @param string $filename  文件名
     * @return boolean
     */
    public function unlink($filename,$type=''){
        switch(strtolower($type)){
            case 'f':       
                $kv     =   $this->getKv();
                unset($this->kvs[$filename]);
                return $kv->delete($filename);
            case 'html':    
                $kv     =   $this->getKv();
                unset($this->htmls[$filename]);
                return $kv->delete($filename);
            default:
                unset($this->contents[$filename]);
                return $this->mc->delete($filename);            
        }        
    }

    /**
     * 读取文件信息
     * @access public
     * @param string $filename  文件名
     * @param string $name  信息名 mtime或者content
     * @return boolean
     */
    public function get($filename,$name,$type=''){
        switch(strtolower($type)){
            case 'html':
                if(!isset($this->htmls[$filename])){
                    $kv = $this->getKv();
                    $this->htmls[$filename] = $kv->get($filename);
                }
                $content = $this->htmls[$filename];
                break;
            default:
                if(!isset($this->contents[$filename])){
                    $this->contents[$filename] = $this->mc->get($filename);
                }
                $content =  $this->contents[$filename];
        }
        if(false===$content){
            return false;
        }
        $info   =   array(
            'mtime'     =>  substr($content,0,10),
            'content'   =>  substr($content,10)
        );
        return $info[$name];        
    }

}