今天我們講的 DBA 并不是傳統的資料庫管理員那個 DBA ,而是一個 PHP 中的巴克利風格資料庫的擴展,巴克利風格資料庫其實就是我們常說的鍵值對形式的 K/V 資料庫,就像我們平常用得非常多的 memcached 或者 redis 那樣,只是一個鍵和一個值對應,不過 memcached 它們主要是存盤在記憶體中,而 DBA 擴展則是將資料存盤在檔案中,就像一個簡單的鍵值對形式的 SQLite 一樣,
DBA 擴展所使用的資料庫型別基本都是開源的,部署發布都很簡單,就是一個 db 檔案,所以說它和 SQLite 很相似,不過缺點就是,它會一次性將這個資料庫檔案加載到記憶體中,我們不能讓這個資料庫太大,否則就會撐爆記憶體,DBA 資料庫都是和程式在一起的,所以它并沒有網路相關的介面,我們一般也只會在代碼本地使用這種資料庫,
在安裝的時候,我們需要在編譯時增加 --enable-dba=shared 配置,然后還要增加一個 --enable-XXXX 配置,XXXX 指的就是我們要使用的巴克利風格資料庫的型別,比較常見的有 dbm 、 ndbm 、 gdbm 、 db2 等等,同樣的,作業系統也需要安裝相關的這些軟體,比如我們系統安裝的就是 gdbm ,需要使用 yum install 來進行安裝,
一個簡單的例子
首先還是通過代碼來看一下,我們的 DBA 資料庫是如何使用的.
// 打開一個資料庫檔案
$id = dba_open("/tmp/test.db", "n", "gdbm");
//$id = dba_popen("/tmp/test1.db", "c", "gdbm");
// 添加或替換一個內容
dba_replace("key1", "This is an example!", $id);
// 如果內容存在
if(dba_exists("key1", $id)){
// 讀取內容
echo dba_fetch("key1", $id), PHP_EOL;
// This is an example!
}
dba_close($id);
首先是使用 dba_open() 來打開一個資料庫檔案,第一個引數是資料庫檔案的路徑,第二個引數是打開方式,包括 r 、 w 、 c 、 n ,r 表示只讀,w 表示讀寫,c 表示創建加讀寫,n 表示如果沒有就創建并可以讀寫,第三個引數就是指定的資料庫型別,我們的系統中只安裝了 gdbm 庫,所以我們使用的就是 gdbm 作為引數,和 mysql 一樣,我們也可以使用 dba_popen() 來打開一個資料檔案的持久鏈接,
dba_replace() 函式則是添加或替換一條資料,如果資料不存在就新增加一條,如果存在了就替換對應 key 的值,第一個引數就是 key ,第二個引數就是資料的值 value ,
dba_exists() 就是判斷指定的鍵是否存在,如果存在的話,我們在這個 if 里面就通過 dba_fetch() 獲取鍵指定的資料,
dba_close() 就和其它資料操作句柄一樣了,關閉資料庫的連接句柄的,
添加、遍歷、洗掉資料
在上面的例子中,我們使用的是 dba_replace() 來添加資料,其實正規的資料添加是有專門的函式的,
// 添加資料
dba_insert("key2","This is key2!", $id);
dba_insert("key3","This is key3!", $id);
dba_insert("key4","This is key4!", $id);
dba_insert("key5","This is key5!", $id);
dba_insert("key6","This is key6!", $id);
// 獲取第一個 key
$key = dba_firstkey($id);
$handle_later = [];
while ($key !== false) {
if (true) {
// 將 key 保存到陣列中
$handle_later[] = $key;
}
// 獲取下一個 key
$key = dba_nextkey($id);
}
// 遍歷 key 陣列,列印資料庫中的全部內容
foreach ($handle_later as $val) {
echo dba_fetch($val, $id), PHP_EOL;
dba_delete($val, $id); // 洗掉key對應的內容
}
// This is key4!
// This is key2!
// This is key3!
// This is an example!
// This is key5!
// This is key6!
dba_insert() 就是插入資料,它不會去替換已經存在的鍵資料,如果是插入已經存在的鍵資訊,就會回傳 false ,
dba_firstkey() 用于獲取第一個鍵,dba_nextkey() 用于獲取下一個鍵,通過這兩個函式,我們就可以獲得整個資料庫中的所有鍵資訊,繼而也就可以通過這些鍵來遍歷整個資料庫中的所有內容,
dba_delete() 就是根據鍵來洗掉一條資料了,
優化、同步資料庫
即使是 mysql ,在長時間使用后,我們也需要進行一些整理優化的作業,比如讓 mysql 自動整理檔案碎片,整理索引等,它使用的 SQL 陳述句是:optimize 表名 ,同理,DBA 擴展也為我們提供了這樣一個函式,
// 優化資料庫
var_dump(dba_optimize($id)); // bool(true)
另外,就像 mysql 的快取一樣,DBA 在操作資料的時候也會進行快取,這時我們可以使用一個函式將快取中的資料強制刷入硬碟檔案中,
// 同步資料庫
var_dump(dba_sync($id)); // bool(true)
當前打開的資料庫串列
我們可以通過一個函式來查看當前打開的資料連接有哪些,因為 DBA 是基于檔案的簡單資料庫,所以我們可以在一段代碼中打開多個資料連接,
// 獲取當前打開的資料庫串列
var_dump(dba_list());
// array(1) {
// [4]=>
// string(12) "/tmp/test.db"
// }
系統所支持的資料庫型別
最后,我們再來看一個支持型的函式,它可以回傳當前我們資料庫所支持的資料庫型別有哪些,
// 當前支持的資料庫型別
var_dump(dba_handlers(true));
// array(5) {
// ["gdbm"]=>
// string(58) "GDBM version 1.18. 21/08/2018 (built May 11 2019 01:10:11)"
// ["cdb"]=>
// string(53) "0.75, $Id: 841505a20a8c9c8e35cac5b5dc3d5cf2fe917478 $"
// ["cdb_make"]=>
// string(53) "0.75, $Id: 95b1c2518144e0151afa6b2b8c7bf31bf1f037ed $"
// ["inifile"]=>
// string(52) "1.0, $Id: 42cb3bb7617b5744add2ab117b45b3a1e37e7175 $"
// ["flatfile"]=>
// string(52) "1.0, $Id: 410f3405266f41bafffc8993929b8830b761436b $"
// }
var_dump(dba_handlers(false));
// array(5) {
// [0]=>
// string(4) "gdbm"
// [1]=>
// string(3) "cdb"
// [2]=>
// string(8) "cdb_make"
// [3]=>
// string(7) "inifile"
// [4]=>
// string(8) "flatfile"
// }
dba_handlers() 有一個布爾型別的引數,通過代碼我們可以看出這個引數的作用就是回傳資訊的詳細程度,
總結
今天介紹的是非常簡單的一套資料庫擴展組件,它的功能就是這些,在日常的生產環境中,實際的應用場景其實并不多,簡單的鍵值對我們可以用 PHP 檔案序列化來保存,而快取則更多的會采用 memcached 之類的工具,所以大家了解一下即可,
測驗代碼:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202008/PHP%E7%9A%84DBA%E6%89%A9%E5%B1%95%E5%AD%A6%E4%B9%A0.md
參考檔案:
https://www.php.net/manual/zh/book.dba.php
https://blog.csdn.net/weixin_40235225/article/details/84994384
關注公眾號:【硬核專案經理】獲取最新文章
添加微信/QQ好友:【xiaoyuezigonggong/149844827】免費得PHP、專案管理學習資料
知乎、公眾號、抖音、頭條搜索【硬核專案經理】
B站ID:482780532
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/286527.html
標籤:其他
