PHP中DBA擴(kuò)展的示例分析

這篇文章主要介紹PHP中DBA擴(kuò)展的示例分析,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

10多年的科爾沁網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都全網(wǎng)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整科爾沁建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)公司從事“科爾沁網(wǎng)站設(shè)計(jì)”,“科爾沁網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

PHP的DBA擴(kuò)展學(xué)習(xí)

今天我們講的 DBA 并不是傳統(tǒng)的數(shù)據(jù)庫管理員那個(gè) DBA ,而是一個(gè) PHP 中的巴克利風(fēng)格數(shù)據(jù)庫的擴(kuò)展。巴克利風(fēng)格數(shù)據(jù)庫其實(shí)就是我們常說的鍵值對(duì)形式的 K/V 數(shù)據(jù)庫。就像我們平常用得非常多的 memcached 或者 redis 那樣,只是一個(gè)鍵和一個(gè)值對(duì)應(yīng),不過 memcached 它們主要是存儲(chǔ)在內(nèi)存中,而 DBA 擴(kuò)展則是將數(shù)據(jù)存儲(chǔ)在文件中,就像一個(gè)簡單的鍵值對(duì)形式的 SQLite 一樣。

DBA 擴(kuò)展所使用的數(shù)據(jù)庫類型基本都是開源的,部署發(fā)布都很簡單,就是一個(gè) db 文件,所以說它和 SQLite 很相似。不過缺點(diǎn)就是,它會(huì)一次性將這個(gè)數(shù)據(jù)庫文件加載到內(nèi)存中,我們不能讓這個(gè)數(shù)據(jù)庫太大,否則就會(huì)撐爆內(nèi)存。DBA 數(shù)據(jù)庫都是和程序在一起的,所以它并沒有網(wǎng)絡(luò)相關(guān)的接口,我們一般也只會(huì)在代碼本地使用這種數(shù)據(jù)庫。

在安裝的時(shí)候,我們需要在編譯時(shí)增加 --enable-dba=shared 配置,然后還要增加一個(gè) --enable-XXXX 配置,XXXX 指的就是我們要使用的巴克利風(fēng)格數(shù)據(jù)庫的類型,比較常見的有 dbm 、 ndbm 、 gdbm 、 db2 等等。同樣的,操作系統(tǒng)也需要安裝相關(guān)的這些軟件,比如我們系統(tǒng)安裝的就是 gdbm ,需要使用 yum install 來進(jìn)行安裝。

一個(gè)簡單的例子

首先還是通過代碼來看一下,我們的 DBA 數(shù)據(jù)庫是如何使用的.

// 打開一個(gè)數(shù)據(jù)庫文件
$id = dba_open("/tmp/test.db", "n", "gdbm");
//$id = dba_popen("/tmp/test1.db", "c", "gdbm");

// 添加或替換一個(gè)內(nèi)容
dba_replace("key1", "This is an example!", $id);

// 如果內(nèi)容存在
if(dba_exists("key1", $id)){
    // 讀取內(nèi)容
    echo dba_fetch("key1", $id), PHP_EOL;
    // This is an example!
}

dba_close($id);

首先是使用 dba_open() 來打開一個(gè)數(shù)據(jù)庫文件,第一個(gè)參數(shù)是數(shù)據(jù)庫文件的路徑,第二個(gè)參數(shù)是打開方式,包括 r 、 w 、 c 、 n ,r 表示只讀,w 表示讀寫,c 表示創(chuàng)建加讀寫,n 表示如果沒有就創(chuàng)建并可以讀寫。第三個(gè)參數(shù)就是指定的數(shù)據(jù)庫類型,我們的系統(tǒng)中只安裝了 gdbm 庫,所以我們使用的就是 gdbm 作為參數(shù)。和 MySQL 一樣,我們也可以使用 dba_popen() 來打開一個(gè)數(shù)據(jù)文件的持久鏈接。

dba_replace() 函數(shù)則是添加或替換一條數(shù)據(jù),如果數(shù)據(jù)不存在就新增加一條,如果存在了就替換對(duì)應(yīng) key 的值。第一個(gè)參數(shù)就是 key ,第二個(gè)參數(shù)就是數(shù)據(jù)的值 value 。

dba_exists() 就是判斷指定的鍵是否存在,如果存在的話,我們?cè)谶@個(gè) if 里面就通過 dba_fetch() 獲取鍵指定的數(shù)據(jù)。

dba_close() 就和其它數(shù)據(jù)操作句柄一樣了,關(guān)閉數(shù)據(jù)庫的連接句柄的。

添加、遍歷、刪除數(shù)據(jù)

在上面的例子中,我們使用的是 dba_replace() 來添加數(shù)據(jù),其實(shí)正規(guī)的數(shù)據(jù)添加是有專門的函數(shù)的。

// 添加數(shù)據(jù)
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);

// 獲取第一個(gè) key
$key = dba_firstkey($id);

$handle_later = [];
while ($key !== false) {
    if (true) {
        // 將 key 保存到數(shù)組中
        $handle_later[] = $key;
    }
    // 獲取下一個(gè) key
    $key = dba_nextkey($id);
}

// 遍歷 key 數(shù)組,打印數(shù)據(jù)庫中的全部內(nèi)容
foreach ($handle_later as $val) {
    echo dba_fetch($val, $id), PHP_EOL;
    dba_delete($val, $id); // 刪除key對(duì)應(yīng)的內(nèi)容
}
// This is key4!
// This is key2!
// This is key3!
// This is an example!
// This is key5!
// This is key6!

dba_insert() 就是插入數(shù)據(jù),它不會(huì)去替換已經(jīng)存在的鍵數(shù)據(jù),如果是插入已經(jīng)存在的鍵信息,就會(huì)返回 false 。

dba_firstkey() 用于獲取第一個(gè)鍵,dba_nextkey() 用于獲取下一個(gè)鍵,通過這兩個(gè)函數(shù),我們就可以獲得整個(gè)數(shù)據(jù)庫中的所有鍵信息,繼而也就可以通過這些鍵來遍歷整個(gè)數(shù)據(jù)庫中的所有內(nèi)容。

dba_delete() 就是根據(jù)鍵來刪除一條數(shù)據(jù)了。

優(yōu)化、同步數(shù)據(jù)庫

即使是 mysql ,在長時(shí)間使用后,我們也需要進(jìn)行一些整理優(yōu)化的工作,比如讓 mysql 自動(dòng)整理文件碎片,整理索引等,它使用的 SQL 語句是:optimize 表名 。同理,DBA 擴(kuò)展也為我們提供了這樣一個(gè)函數(shù)。

// 優(yōu)化數(shù)據(jù)庫
var_dump(dba_optimize($id)); // bool(true)

另外,就像 mysql 的緩存一樣,DBA 在操作數(shù)據(jù)的時(shí)候也會(huì)進(jìn)行緩存,這時(shí)我們可以使用一個(gè)函數(shù)將緩存中的數(shù)據(jù)強(qiáng)制刷入硬盤文件中。

// 同步數(shù)據(jù)庫
var_dump(dba_sync($id)); // bool(true)

當(dāng)前打開的數(shù)據(jù)庫列表

我們可以通過一個(gè)函數(shù)來查看當(dāng)前打開的數(shù)據(jù)連接有哪些,因?yàn)?DBA 是基于文件的簡單數(shù)據(jù)庫,所以我們可以在一段代碼中打開多個(gè)數(shù)據(jù)連接。

// 獲取當(dāng)前打開的數(shù)據(jù)庫列表
var_dump(dba_list());
// array(1) {
//     [4]=>
//     string(12) "/tmp/test.db"
//   }

系統(tǒng)所支持的數(shù)據(jù)庫類型

最后,我們?cè)賮砜匆粋€(gè)支持型的函數(shù),它可以返回當(dāng)前我們數(shù)據(jù)庫所支持的數(shù)據(jù)庫類型有哪些。

// 當(dāng)前支持的數(shù)據(jù)庫類型
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() 有一個(gè)布爾類型的參數(shù),通過代碼我們可以看出這個(gè)參數(shù)的作用就是返回信息的詳細(xì)程度

以上是“PHP中DBA擴(kuò)展的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

當(dāng)前題目:PHP中DBA擴(kuò)展的示例分析
本文來源:http://muchs.cn/article42/jogphc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)、動(dòng)態(tài)網(wǎng)站、小程序開發(fā)、自適應(yīng)網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、建站公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)