今天我们讲的 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

PHP的DBA扩展学习的更多相关文章

  1. 《PHP扩展学习系列》系列分享专栏

    <PHP扩展学习系列>系列分享专栏   <PHP扩展学习系列>已整理成PDF文档,点击可直接下载至本地查阅https://www.webfalse.com/read/20177 ...

  2. PHP中操作任意精度大小的GMP扩展学习

    对于各类开发语言来说,整数都有一个最大的位数,如果超过位数就无法显示或者操作了.其实,这也是一种精度越界之后产生的精度丢失问题.在我们的 PHP 代码中,最大的整数非常大,我们可以通过 PHP_INT ...

  3. PHP中非常好玩的Calendar扩展学习

    为什么说这个 Calendar 扩展很好玩呢?因为你基本用不到它!这个扩展是一套关于日期历法的扩展,但是对于我们来说,它没有农历的相关操作,所以对于我们中国人来说这个扩展并没有什么实际的作用.不过这并 ...

  4. PHP中的MySQLi扩展学习(六)MySQLI_result对象操作

    在之前的文章中,我们就已经接触过 MYSQLI_result 相关的内容.它的作用其实就是一个查询的结果集.不过在 PDO 中,一般直接通过 query() 或者 PDOStatement 对象进行查 ...

  5. PHP中的MySQLi扩展学习(五)MySQLI_STMT对象操作

    就像 PDO 中的 PDO_Statment 对象一样,MySQLI_STMT 对象也是一个预处理语句所形成的对象,专门用来操作 MySQLi 所生成的预处理语句的.其实操作方式之类也都比较相似,不外 ...

  6. PHP中的MySQLi扩展学习(四)mysqli的事务与预处理语句

    对于 MySQLi 来说,事务和预处理语句当然是它之所以能够淘汰 MySQL(原始) 扩展的资本.我们之前也已经学习过了 PDO 中关于事务和预处理语句相关的内容.所以在这里,我们就不再多讲理论方面的 ...

  7. PHP中的MySQLi扩展学习(三)mysqli的基本操作

    我们继续 MySQLi 扩展的学习,上篇文章中提到过,MySQLi 的扩展相对于 PDO 来说功能更加的丰富,所以我们依然还会在学习过程中穿插各种 MySQLi 中好玩的方法函数.不过,今天的主角是 ...

  8. PHP中的MySQLi扩展学习(二)mysqli类的一些少见的属性方法

    虽说是少见的一些属性方法,但是可能还是有不少同学在日常的开发中使用过,这里只是学习了可能相对来说我们用得比较少的一些 mysqli 的属性或方法.就当是扩展一下自己的知识体系. 切换用户 首先就是切换 ...

  9. PHP中的MySQLi扩展学习(一)MySQLi介绍

    关于 PDO 的学习我们告一段落,从这篇文章开始,我们继续学习另外一个 MySQL 扩展,也就是除了 PDO 之外的最核心的 MySQLi 扩展.可以说它的祖先,也就是 MySQL(原始) 扩展是我们 ...

随机推荐

  1. ViewPager2 使用说明书

    ViewPager2 使用说明书 零.Demo 项目源码 演示 apk 如果对你有用,希望能给个 star,谢谢. 一.功能 官方关于使用 ViewPager2 创建滑动视图的说明: Swipe vi ...

  2. Beescms V4.0_R_20160525代码审计笔记

    写在前面 什么是报错注入?正常用户访问服务器发送id信息返回正确的id数据.报错注入是想办法构造语句,让错误信息中可以显示数据库的内容:如果能让错误信息中返回数据库中的内容,即实现SQL注入. 复现过 ...

  3. NOIP 模拟 $26\; \rm 降雷皇$

    题解 \(by\;zj\varphi\) 用树状数组优化一下求最长上升子序列即可. 至于第二问,在求出答案后开 \(n\) 棵线段树,每颗维护当前最长上升子序列长度的方案数. Code #includ ...

  4. spring cloud 网管篇zuul

    1, consul 2, zuul 程序的yml 文件 server: port: 8083spring: application: name: zuulInfo # 应用名称 cloud: cons ...

  5. QT 自定义控件 以及信号和槽的使用

    自定义login 控件 Login头文件 #ifndef LOGIN_H #define LOGIN_H #include <QWidget> namespace Ui { class L ...

  6. ffmpeg 视频ts切片生成m3u8

    下面几种转换方式是不同版本和方法 新版本ffmpeg转视频直接可以切边并生成 m3u8(目前用的方式,也可以用选项 segment ): ffmpeg -i '源文件.mp4' -c:v h264 - ...

  7. java基本数据类型转换字符串

    1.基本数据类型转换为字符串 int t1 = 2; String t2 = Integer.toString(t1); 2.字符串转换为基本数据类型 int t3 = Integer.parseIn ...

  8. jQuery中ajax请求的六种方法(三、四):$.getJSON()方法

    4.$.getJSON()方法 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"&g ...

  9. Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient

    1.今天在进行hive测试的时候,发现hive一直进不去,并且报了这个错误. Unable to instantiate org.apache.hadoop.hive.ql.metadata.Sess ...

  10. Linux下修改mysql默认最大连接数

    liunx下修改mysql最大连接数(Centos下测试通过)1.查看当前系统下mysql设置的最大连接数方式一.mysqladmin -uroot -p variables |grep max_co ...