这个扩展是将Tokyo Cabinet的部分API提供给PHP客户端调用。
下面是来自百度百科的一段对Tokyo Cabinet的介绍:
Tokyo Cabinet 是一个DBM的实现。这里的数据库由一系列key-value对的记录构成。key和value都可以是任意长度的字节序
列,既可以是二进制也可以是字符串。这里没有
数据类型和数据表的概念。
当 做为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());
测试结果:
源码包下载地址:cabinet.zip
php5.3-nts的DLL扩展下载:http://l9.yunpan.cn/lk/QEcgvkyCGXhDY
新增支持Linux下的编译
Linux下的使用说明见cabinet_linux.php
Windows下的使用说明见cabinet_win32.php
往期回顾: