Heim  >  Artikel  >  php教程  >  C实现PHP扩展《Cabinet》

C实现PHP扩展《Cabinet》

WBOY
WBOYOriginal
2016-06-06 19:54:46980Durchsuche

这个扩展是将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》类数据抓取

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:《Advanced PHP Programming》读书笔记Nächster Artikel:PHP使用JSON