这个扩展是将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都可以是任意长度的字节序
列,既可以是二进制也可以是字符串。这里没有数据类型和数据表的概念。
当 做为Hash表数据库使用时,每个key必须是不同的,因此无法存储两个key相同的值。提供了以下访问方法:提供key,value参数来存储,按 key删除记录,按key来读取记录,另外,遍历key也被支持,虽然顺序是任意的不能被保证。这些方法跟Unix标准的DBM,例如GDBM,NDBM 等等是相同的,但是比它们的性能要好得多(因此可以替代它们) 。
与Redis等NoSQL类似,高性能的KEY-VALUE形式数据库,支持内存读写,同步文件等。
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
往期回顾:
C实现PHP扩展《Image_Tool》图片常用处理工具类
C实现PHP扩展《Fetch_Url》类数据抓取