乐趣区

关于php: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 文件序列化来保留,而缓存则更多的会采纳 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

各自媒体平台均可搜寻【硬核项目经理】

退出移动版