中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP中DBA擴展的示例分析

發布時間:2021-06-11 10:13:38 來源:億速云 閱讀:108 作者:小新 欄目:編程語言

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

PHP的DBA擴展學習

今天我們講的 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中DBA擴展的示例分析”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

特克斯县| 水城县| 阿克| 日照市| 平阳县| 宜良县| 汝城县| 肥西县| 靖州| 祁东县| 武邑县| 石泉县| 德兴市| 大同市| 广州市| 河北省| 连江县| 宣汉县| 南涧| 诸暨市| 剑河县| 黑龙江省| 保靖县| 嘉鱼县| 铅山县| 嵊州市| 金坛市| 睢宁县| 玉田县| 甘洛县| 蒙自县| 泉州市| 西宁市| 阳山县| 中阳县| 昭苏县| 应城市| 永春县| 沁水县| 汝城县| 达尔|