今天我们说的DBA不是传统的数据库管理员DBA,而是Buckley风格的数据库在PHP中的扩展。Buckley式数据库其实就是我们常说的K/V数据库,以键值对的形式存在。就像我们平时用的比较多的memcached或者redis,只有一个key对应一个value,但是memcached主要是把它们存放在内存中,而DBA扩展则是把数据存放在文件中,就像一个简单的键值对形成一样作为SQLite。DBA扩展使用的数据库类型基本都是开源的,部署和发布都很简单,一个db文件就可以,所以和SQLite很像。但缺点是会一次性加载数据库文件到内存中。数据库不能太大,否则会爆内存。DBA数据库都是和程序在一起的,所以没有网络相关的接口,我们一般只在代码本地使用这种数据库。安装的时候我们需要在编译的时候加上--enable-dba=shared配置,然后再加一个--enable-XXXX配置,XXXX指的是我们要使用的Buckley风格数据库的类型,比较常见的有dbm、ndbm、gdbm、db2等。同样,操作系统也需要安装这些相关的软件。比如我们的系统安装了gdbm,需要使用yuminstall来安装。一个简单的例子首先让我们看看我们的DBA数据库是如何使用的。//打开一个数据库文件$id=dba_open("/tmp/test.db","n","gdbm");//$id=dba_popen("/tmp/test1.db","c","gdbm");//添加或替换内容dba_replace("key1","Thisisanexample!",$id);//如果内容存在if(dba_exists("key1",$id)){//读取内容echodba_fetch("key1",$id),PHP_EOL;//这是一个例子!}dba_close($id);第一种是使用dba_open()打开一个数据库文件,第一个参数是数据库文件的路径,第二个参数是打开方式,包括r,w,c,n,r表示只读,w表示read-write,c表示create加上readandwrite,n表示create加readandwrite,如果没有。第三个参数是指定的数据库类型。我们的系统只安装了gdbm库,所以我们使用gdbm作为参数。和mysql一样,我们也可以使用dba_popen()打开一个数据文件的持久链接。dba_replace()函数是添加或替换一条数据。如果数据不存在,它将添加一个新数据。如果存在,它将替换相应键的值。第一个参数是键,第二个参数是数据的值。dba_exists()是判断指定的key是否存在。如果存在,我们使用dba_fetch()获取这个if中key指定的数据。dba_close()和其他数据操作句柄一样,关闭数据库连接句柄。添加、遍历和删除数据在上面的例子中,我们使用dba_replace()来添加数据。其实定时添加数据还有专门的函数。//添加数据dba_insert("key2","Thisiskey2!",$id);dba_insert("key3","Thisiskey3!",$id);dba_insert("key4","Thisiskey4!",$id);dba_insert("key5","Thisiskey5!",$id);dba_insert("key6","Thisiskey6!",$id);//获取第一个key$key=dba_firstkey($id);$handle_later=[];while($key!==false){if(true){//将密钥保存在数组中$handle_later[]=$key;}//获取下一个key$key=dba_nextkey($id);}//遍历key数组,打印数据库中的所有内容foreach($handle_lateras$val){echodba_fetch($val,$id),PHP_EOL;dba_delete($val,$id);//删除key对应的内容}//Thisiskey4!//Thisiskey2!//Thisiskey3!//Thisisanexample!//Thisiskey5!//Thisiskey6!dba_insert()是Insert数据,不会替换已有的key数据,如果是插入已有的key信息,则返回false。dba_firstkey()用于获取第一个key,dba_nextkey()用于获取下一个key。通过这两个函数,我们可以得到整个数据库中所有的key信息,然后我们可以通过这些key遍历整个数据库中的所有东西。dba_delete()是根据key删除一条数据。优化和同步数据库即使是mysql,在使用时间长了之后,我们还是需要做一些整理和优化的工作,比如让mysql自动整理文件碎片,整理索引等,它使用的SQL语句是:optimize表名。同样,DBA扩展也为我们提供了这样的功能。//优化数据库var_dump(dba_optimize($id));//bool(true)另外,就像mysql的缓存一样,DBA在操作数据的时候也会缓存。这时候我们可以使用一个函数,将缓存中的数据强行刷入硬盘文件。//同步数据库var_dump(dba_sync($id));//bool(true)listofcurrentlyopendatabases我们可以使用一个函数来检查当前打开了哪些数据连接,因为DBA是一个简单的基于文件的数据库,所以我们可以在一段代码中打开多个数据连接。//获取当前打开的数据库列表var_dump(dba_list());//array(1){//[4]=>//string(12)"/tmp/test.db"//}支持system数据库类型最后我们来看一个支持函数,它可以返回我们的数据库目前支持的数据库类型。//当前支持的数据库类型var_dump(dba_handlers(true));//array(5){//["gdbm"]=>//string(58)"GDBMversion1.18.21/08/2018(builtMay11201901: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"](0,2)"stringId: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.phphttps://blog.csdn.net/weixin_40235225/article/details/84994384可以搜索[硬核项目经理】
