明天咱们讲的 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
各自媒体平台均可搜寻【硬核项目经理】