Home  >  Article  >  php教程  >  SQLITE缓存

SQLITE缓存

PHP中文网
PHP中文网Original
2016-05-26 08:18:401347browse

完整类源码  

<?php

/**
 * Sqlite缓存类
 * @author WeakSun <52132522@qq.com>
 */

class Sqlite {

	static protected $handler;
	protected $options = array(
		&#39;table&#39; => &#39;iCaches&#39;
	);

	/**
	 * 架构函数
	 * @access public
	 */
	public function __construct($options = array()) {
		$this->options[&#39;prefix&#39;] = isset($options[&#39;prefix&#39;]) ? $options[&#39;prefix&#39;] : C(&#39;DATA_CACHE_PREFIX&#39;, null, &#39;&#39;);
		$this->options[&#39;expire&#39;] = isset($options[&#39;expire&#39;]) ? $options[&#39;expire&#39;] : C(&#39;DATA_CACHE_TIME&#39;, null, 36000);
		$this->options[&#39;nowTime&#39;] = isset($GLOBALS[&#39;_beginTime&#39;]) ? $GLOBALS[&#39;_beginTime&#39;] : microtime(true);
		$dbFile = TEMP_PATH . &#39;Caches.tmp&#39;;
		$isCreate = is_file($dbFile);
		if (empty(static::$handler)) {
			static::$handler = new PDO("sqlite:{$dbFile}", null, null, array(PDO::ATTR_PERSISTENT => true));
			empty($isCreate) && $this->exec("PRAGMA encoding = &#39;UTF8&#39;;PRAGMA temp_store = 2;PRAGMA auto_vacuum = 0;PRAGMA count_changes = 1;PRAGMA cache_size = 9000;");
			$this->chkTable() || $this->createTable();
		}
	}

	public function __destruct() {
		return $this->exec("DELETE FROM `{$this->options[&#39;table&#39;]}` WHERE `expire` < strftime(&#39;%s&#39;,&#39;now&#39;);VACUUM;");
	}

	public function __call($method, $arguments) {
		if (method_exists(self::$handler, $method)) {
			return call_user_func_array(array(self::$handler, $method), $arguments);
		} else {
			E(__CLASS__ . &#39;:&#39; . $method . L(&#39;_METHOD_NOT_EXIST_&#39;));
			return;
		}
	}

	/**
	 * 读取缓存
	 * @access public
	 * @param string $name 缓存变量名
	 * @return mixed
	 */
	public function get($name) {
		$id = $this->getName($name);
		$sth = static::$handler->query("SELECT `value` FROM `{$this->options[&#39;table&#39;]}` WHERE `id`=&#39;{$id}&#39; AND `expire` > strftime(&#39;%s&#39;,&#39;now&#39;) LIMIT 1", PDO::FETCH_NUM);
		if (!empty($sth)) {
			N(&#39;cache_read&#39;, 1);
			list($data) = $sth->fetch();
			return unserialize($data);
		} else {
			return false;
		}
	}

	/**
	 * 写入缓存
	 * @access public
	 * @param string $name 缓存变量名
	 * @param mixed $value  存储数据
	 * @param int $expire  有效时间 0为永久
	 * @return boolean
	 */
	public function set($name, $value, $expire = 0) {
		N(&#39;cache_write&#39;, 1);
		$data = serialize($value);
		if ($expire < 0 || $expire === false) {
			return true;
		} elseif (is_null($value) || $value === false) {
			return $this->rm($name);
		} elseif ($expire < 1) {
			$expire = 315360000;
		}
		$id = $this->getName($name);
		return $this->exec("REPLACE INTO `{$this->options[&#39;table&#39;]}` VALUES(&#39;{$id}&#39;,&#39;{$data}&#39;,{$expire}+strftime(&#39;%s&#39;,&#39;now&#39;))");
	}

	/**
	 * 删除缓存
	 * @access public
	 * @param string $name 缓存变量名
	 * @return boolean
	 */
	public function rm($name) {
		$id = $this->getName($name);
		return $this->exec("DELETE FROM `{$this->options[&#39;table&#39;]}` WHERE `id` = &#39;{$id}&#39;");
	}

	/**
	 * 清除缓存
	 * @access public
	 * @param string $name 缓存变量名
	 * @return boolean
	 */
	public function clear() {
		return $this->exec("DELETE FROM `{$this->options[&#39;table&#39;]}`;");
	}

	/**
	 * 检查当前表是否存在
	 * @return bool 返回检查结果,存在返回True,失败返回False
	 */
	protected function chkTable() {
		return in_array($this->options[&#39;table&#39;], $this->getTables());
	}

	/**
	 * 获取当前数据库的数据表列表
	 * @return array 返回获取到的数据表列表数组
	 */
	protected function getTables() {
		$tables = $data = array();
		$sth = $this->query("SELECT `name` FROM `sqlite_master` WHERE `type` = &#39;table&#39; UNION ALL SELECT `name` FROM `sqlite_temp_master`");
		if (!empty($sth)) {
			while ($row = $sth->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_NEXT)) {
				$tables[] = $row[0];
			}
			unset($sth, $row);
		}
		return $tables;
	}

	/**
	 * 创建当前数据表
	 * @return integer 成功返回1,失败返回0
	 */
	protected function createTable() {
		return $this->exec("CREATE TABLE IF NOT EXISTS `{$this->options[&#39;table&#39;]}` (`id` VARCHAR PRIMARY KEY ON CONFLICT FAIL NOT NULL COLLATE &#39;NOCASE&#39;,`value` TEXT NOT NULL,`expire` INTEGER NOT NULL);");
	}

	/**
	 * 获取缓存名称
	 * @param string $name
	 * @return string
	 */
	protected function getName($name) {
		if (!is_string($name) && !is_numeric($name)) {
			$name = md5(serialize($name));
		}
		return $this->options[&#39;prefix&#39;] . $name;
	}

}

                   

                   

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Previous article:php异常处理示例Next article:PHP简单的事务测试用例