// +---------------------------------------------------------------------- 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]; } }