首页  >  文章  >  php教程  >  C实现PHP扩展《Cabinet》

C实现PHP扩展《Cabinet》

WBOY
WBOY原创
2016-06-06 19:54:46979浏览

这个扩展是将Tokyo Cabinet的部分API提供给PHP客户端调用。 下面是来自百度百科的一段对Tokyo Cabinet的介绍: Tokyo Cabinet 是一个DBM的实现。这里的数据库由一系列key-value对的记录构成。key和value都可以是任意长度的字节序 列,既可以是二进制也可以是

这个扩展是将Tokyo Cabinet的部分API提供给PHP客户端调用。

下面是来自百度百科的一段对Tokyo Cabinet的介绍:

Tokyo Cabinet 是一个DBM的实现。这里的数据库由一系列key-value对的记录构成。key和value都可以是任意长度的字节序

C实现PHP扩展《Cabinet》

  

列,既可以是二进制也可以是字符串。这里没有数据类型和数据表的概念。

当 做为Hash表数据库使用时,每个key必须是不同的,因此无法存储两个key相同的值。提供了以下访问方法:提供key,value参数来存储,按 key删除记录,按key来读取记录,另外,遍历key也被支持,虽然顺序是任意的不能被保证。这些方法跟Unix标准的DBM,例如GDBM,NDBM 等等是相同的,但是比它们的性能要好得多(因此可以替代它们) 。

与Redis等NoSQL类似,高性能的KEY-VALUE形式数据库,支持内存读写,同步文件等。


一、先看看实现的Cabinet 类的使用说明文档:
class Cabinet{
	protected $db;

	public function __construct();//kcdbnew
	
	/**
	* 打开数据库文件
	* @param string $path 文件路径
	   * 如果是-,该数据库将是一个原型hash数据库
    * 如果是+,该数据库将是一个原型树数据库
    * 如果它是:,该数据库将存储的数据库
    * 如果是*,该数据库将高速缓存哈希数据库
    * 如果是%,该数据库将是一个缓存树的数据库
    * 如果它的后缀是.KCH,该数据库将一个文件哈希数据库
    * 如果它的后缀是.KCT,数据库将一个文件树的数据库。
    * 如果它的后缀是.KCD,该数据库将是一个目录hash数据库。
    * 如果它的后缀是.kcf,该数据库将一个目录树数据库。
    * 如果它的后缀是.kcx,该数据库将是一个纯文本的数据库。
    * 调整参数,可以追踪的名称,以“#”隔开。
    * 每个参数的名称和值组成的,由“=”分隔。如果在“类型”参数指定,
    * 数据库类型确定的值中的“ - ”,“+”,“:”,“*”,“%”,“KCH”,“KCT”,“KCD”,KCF“,和”kcx“的。
    * 所有类型的数据库支持的”日志“记录参数,“logkinds”,和“logpx”。原型散列数据库和原型树数据库做不支持任何其他的调整参数。
    * stash数据库支持“BNUM”。高速缓存hash数据库支持“opts”,“BNUM”,“zcomp”,“capcnt”,“capsiz”,和“zkey”。
    * 高速缓存树的数据库支持所有的参数除了容量的cache hash数据库限制,并支持“psiz”,“RCOMP”,“pccap”。
    * 文件哈希数据库支持“APOW”中,“fpow”,“选择采用”中,“BNUM”中,“msiz”,“dfunit”中,“zcomp”,和“zkey。
    * 文件树的数据库支持的文件hash数据库和“psiz”,“RCOMP”参数,“pccap”。
    * 目录的哈希数据库支持选择采用“中,”zcomp“,和”zkey“。
    * 目录树中的数据库支持所有参数的目录散列数据库和“psiz”,“RCOMP”,“除了pccap”。
    * 纯文本数据库不支持任何其他调整参数。
    * 
	* @waning “ - ”,“+”,“:”,“*”,“%” 目前设置其中之一,数据的生命周期只在单次请求中,因为多进程环境下,数据无法驻留。
	* @param int $mode 连接模式
	* KCOWRITER    写模式
	* KCOREADER    读模式
	* KCOCREATE    如果文件不存在创建新的数据库
	* KCOTRUNCATE  始终创建新的数据库
	* KCOAUTOTRAN  每次的更新创建等操作都是隐性事务。与mysql的自动提交一样
	* KCOAUTOSYNC  每次更新创建等操作都会隐性的立即同步到文件
	* KCONOLOCK    无锁打开数据库
	* KCOTRYLOCK   尝试有锁打开数据库,非阻塞
	* KCONOREPAIR  还不清楚什么用处
	* @return boolean 打开失败返回false
	*/
	public function kcdbopen($path, $mode);

	/**
	 * 关闭数据库资源
	 */
	public function kcdbclose();
    
	/**
	 * 最近一次的错误编码
	 * @return int
	 */
	public function kcdbecode();
    
	/**
	 * 最近一次的错误描述
	 * @return string
	 */
	public function kcdbemsg();
	
	/**
	 * 新增一条记录
	 * @param string $key 键名
	 * @param mixed $value 键值
	 * @return boolean
	 * @waning 如果键名已经存在,则覆盖原有记录
	 */
	public function kcdbset($key, $value);
    
	/**
	 * 新增一条记录
	 * @param string $key 键名
	 * @param mixed $value 键值
	 * @waning 如果键名已经存在,则返回false
	 */
	public function kcdbadd($key, $value);
    
	*
	 * 更新记录的值
	 * @param string $key 键名
	 * @param mixed $value 新的值
	 * @return boolean
	 * @waning 如果键名不存在,则返回false。
	 
	public function kcdbreplace($key, $value);
    
	/**
	 * 追加记录的值
	 * @param string $key 键名
	 * @param mixed $value 附加值
	 * @return boolean
	 * @waning 如果键名不存在,则新建并存储value。如果存在,则在原有记录上追加value。
	 */
	public function kcdbappend($key, $value);
    
	/**
	 * 删除一条记录
	 * @param string $key
	 * @return boolean
	 * @waning 如果键名不能在,则返回false。
	 */
	public function kcdbremove($key);
    
	/**
	 * 获取一条记录
	 * @param string $key
	 * @return mixed
	 * @waning 如果键名不存在,则返回NULL
	 */
	public function kcdbget($key);
    
	/**
	 * 检查记录是否存在
	 * @param string $key
	 * @return boolean
	 */
	public function kcdbcheck($key);
    
	/**
	 * 开始事务
	 * @return boolean 创建事务成功返回true
	 */
	public function kcdbbegintran();

	/**
	 * 结束事务
	 * @param $commit true提交事务 false取消事务
	 * @return boolean 
	 */
	public function kcdbendtran($commit);
    
	/**
	 * 创建数据库副本
	 * @param string $dest 副本的存储路径
	 */
    
	/**
	 * 清空数据库记录
	 * @return boolean
	 */
	public function kcdbclear();
    
	/**
	 * 返回记录总数
	 * @return int
	 */
	public function kcdbcount();
    
	/**
	 * 返回当前数据库文件大小
	 * @return long
	 */
	public function kcdbsize();
    
	/**
	 * 返回当前数据库文件路径
	 */
	public function kcdbpath();
    
	/**
	 * 返回当前数据库的状态描述
	 */
	public function kcdbstatus();
    
	/**
	 * 返回指定键名前缀的集合
	 * @param string $prefix 键名前缀 例如 pp2012_
	 * @param int 最大的检索数量
	 * @return array
	 */
	public function kcdbmatchprefix($prefix, $max);
    
	/**
	 * 根据正则匹配键名的集合
	 * @param string $regex
	 * @param int 最大检索数量
	 * @return array
	 */
	public function kcdbmatchregex($regex, $max);
    
	/**
	 * 数据合并
	 * @param Object $db 实例化的Cabinet对象
	 * @param int $mode 合并模式
  * KCMSET		覆盖现有的值
	 * KCMADD		保留现有的值
	 * KCMREPLACE	修改现有的记录
	 * KCMAPPEND	追加新的价值
	 */
	public function kcdbmerge($dbarray, $mode);
}

二、测试文件
function test($msg, $result){
	if($result){
		echo "--------{$msg} success--------\n";
	}else{
		echo "--------{$msg} failed---------\n";
	}
}

//test kcdbset
$cabinet1 = new Cabinet();
$cabinet1->kcdbopen("casket2.kch", KCOWRITER | KCOCREATE);
test("test kcdbset", $cabinet1->kcdbset("ppcc2011_1", "ppcc2011_1"));
test("test kcdbadd", $cabinet1->kcdbadd("ppcc2012_2", "ppcc2012_2"));
test("test kcdbadd", $cabinet1->kcdbadd("ppcc2012_3", "ppcc2012_3"));
test("test kcdbcheck", $cabinet1->kcdbcheck("ppcc2011_1"));


// test kcdbmerge
$cabinet1 = new Cabinet();
$cabinet1->kcdbopen("casket2.kch", KCOWRITER | KCOCREATE);
$cabinet2 = new Cabinet();
$cabinet2->kcdbopen("casket.kch", KCOWRITER | KCOCREATE);
test("test kcdbmerge", $cabinet2->kcdbmerge(array($cabinet1), KCMADD));

// test kcdbmatchprefix
test("test kcdbmatchprefix", $cabinet1->kcdbmatchprefix("ppcc201", 100));

// test kcdbcopy
test("test kcdbcopy", $cabinet1->kcdbcopy("copy.kch"));

// test transaction
test("test kcdbbegintran", $cabinet1->kcdbbegintran());
$cabinet1->kcdbadd("ppcc2012_1", "ppcc2012_1");
$cabinet1->kcdbendtran(false);//取消事务

$cabinet1->kcdbbegintran();
$cabinet1->kcdbadd("ppcc2012_1", "ppcc2012_1");
$cabinet1->kcdbendtran(false);//提交事务


//test kcdbstatus kcdbcount kcdbpath kcdbclear kcdbget kcdbremove kcdbappend kcdbreplace
test("test kcdbappend", $cabinet1->kcdbappend('ppcc2012_1', '_append'));

test("test kcdbreplace", $cabinet1->kcdbreplace('ppcc2012_1', 'new_value'));

test("test kcdbremove", $cabinet1->kcdbremove('ppcc2012_1'));

test("test kcdbstatus", $cabinet1->kcdbstatus());

test("test kcdbcount", $cabinet1->kcdbcount());

test("test kcdbclear", $cabinet1->kcdbclear());

test("test kcdbpath", $cabinet1->kcdbpath());

测试结果:

C实现PHP扩展《Cabinet》


源码包下载地址:cabinet.zip

php5.3-nts的DLL扩展下载:http://l9.yunpan.cn/lk/QEcgvkyCGXhDY

新增支持Linux下的编译

Linux下的使用说明见cabinet_linux.php

Windows下的使用说明见cabinet_win32.php


往期回顾:

C实现PHP扩展《Image_Tool》图片常用处理工具类

C实现PHP扩展《Fetch_Url》类数据抓取

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn