C實現PHP擴充《Cabinet》

來源:互聯網
上載者:User

這個擴充是將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》類資料抓取

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.