這個擴充是將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 kcdbmatchprefixtest("test kcdbmatchprefix", $cabinet1->kcdbmatchprefix("ppcc201", 100));// test kcdbcopytest("test kcdbcopy", $cabinet1->kcdbcopy("copy.kch"));// test transactiontest("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 kcdbreplacetest("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》類資料抓取