php操作dba的總結筆記
1.簡介Database (dbm-style) Abstraction Layer
這些函式是建立在訪問 Berkeley DB (伯克利資料庫)的基礎之上。
目前 PHP 支援的 DBA 資料庫包括:
- dbm:柏克萊發展的最早期 DBA 資料庫。
- ndbm:較新且較有彈性的 DBA。
- db3:由 Sleepycat 軟體開發的 DB3。
- db4:由 Sleepycat 軟體開發的 DB4,從php4.3.2開始支援。
- cdb:這是 qmail 作者開發快速可靠的 DBA,http://cr.yp.to/cdb.html.
- cdb_make
- flatfile
- inifile
- qdbm
2.相關的函式
- dba_close —關閉dba資料庫
- dba_delete —刪除資料庫中指定的key
- dba_exists — 檢查key是否存在
- dba_fetch— 取得指定key的值
- dba_firstkey — 獲取第一個key
- dba_handlers —列出所有可用的handler
- dba_insert— 插入一條記錄
- dba_key_split— Splits a key in string representation into array representation
- dba_list — 列出所有開啟的資料庫
- dba_nextkey — 獲取下一個key
- dba_open —開啟資料庫
- dba_optimize — 優化資料庫
- dba_popen — 使用長連結開啟資料庫
- dba_replace —替換或者插入一條記錄
- dba_sync — 資料庫同步
3.函式說明和範例
3.1 dba_open()
3.1.1 說明:
resource dba_open ( string $path , string $mode [, string $handler [, mixed $... ]] 連結資料庫
3.1.2 引數
string $path :開啟資料庫所在的目錄。
string $mode : 開啟的模式。第一個字元位置,'r’:讀的方式; 'w’:寫的方式; 'c’:讀寫方式,如果資料庫不存在,則建立; 'n’:建立,以讀寫方式; 第二個字元位置,'l’:以鎖定的方式,並生成一個.lck的檔案; 'd’:鎖定資料庫自己。第三個字元位置:'t’:測試訪問鎖而且不想等待的時候,用此選項。
注意:對一個數據庫檔案,只能有一個人可以寫操作。當dba資料庫用在web服務或者多個需要寫操作的時候,只能是一個接著一個,不能同時寫,而且在寫的時候,讀也是不允許的。dba的擴充套件用鎖來防止同時操作,請看下錶:
already open | mode = "rl" | mode = "rlt" | mode = "wl" | mode = "wlt" | mode = "rd" | mode = "rdt" | mode = "wd" | mode = "wdt" |
---|---|---|---|---|---|---|---|---|
not open | ok | ok | ok | ok | ok | ok | ok | ok |
mode = "rl" | ok | ok | wait | false | illegal | illegal | illegal | illegal |
mode = "wl" | wait | false | wait | false | illegal | illegal | illegal | illegal |
mode = "rd" | illegal | illegal | illegal | illegal | ok | ok | wait | false |
mode = "wd" | illegal | illegal | illegal | illegal | wait | false | wait | false |
- ok: the second call will be successfull. 第二次呼叫將會成功
- wait: the second call waits until dba_close() is called for the first. 第二次呼叫會等待,直到呼叫dba_close() 時候
- false: the second call returns false. 第二次呼叫會返回false
- illegal: you must not mix "l" and "d" modifiers for mode parameter. 'l' 和 'd'禁止混合使用在模式引數中
string $handler:使用的資料庫
3.1.3 返回值
成功返回handler, 失敗返回 false
3.1.4 示例
//開啟資料庫test.db,使用的handler是db4
$dbh = dba_open( "./test.db", "c", "db4" );
if (!$dbh) {
echo "Open db4 false./n";
exit;
}
3.2 dba_insert()
3.2.1 說明
bool dba_insert ( string $key , string $value , resource $handle ) 插入一條記錄3.2.2 引數
string $key key值,假如key存在的話,函式返回false
string $value 想要插入的值
resource $handle 資料庫的handler, 通過dba_open() , dba_popen() 返回
3.2.3 返回值
如果成功則返回 TRUE,失敗則返回 FALSE
3.2.4 示例
$dbh = dba_open( "./data/products", "c", "db4" )
or die( "Couldn't open database" );
dba_insert( "Sonic Screwdriver", "23.20", $dbh);
dba_insert( "Tricorder", "55.50", $dbh);
dba_insert( "ORAC AI", "2200.50", $dbh);
dba_insert( "HAL 2000", "4500.50", $dbh); dba_close( $dbh );
3.3 dba_fetch()
3.3.1 說明
string dba_fetch ( string $key , resource $handle ) 通過指定的key獲取資料
3.3.2 引數
string $key key值
resource $handle 資料庫的handler,通過dba_open(), dba_popen() 返回
3.3.3 返回值
如果key對應的value值存在,返回data字串,否則返回FALSE
3.3.4 示例
$dbh = dba_open( "./data/products", "c", "db4" )
or die( "Couldn't open database" );
$tricorder = dba_fetch('Tricorder', $dbh);
dba_close($dbh);
3.4 dba_delete()
3.4.1 說明
bool dba_delete ( string $key , resource $handle ) 通過指定的key刪除資料庫記錄
3.4.2 引數
string $key key值, 如果key不存在,返回false
resource $handle 資料庫的handler, 通過呼叫 dba_open(), dba_popen() 返回
3.4.3 返回值
如果成功則返回 TRUE,失敗則返回 FALSE。
3.4.4 示例
$dbh = dba_open( "./data/products", "c", "db4" )
or die( "Couldn't open database" );
$res_del = dba_delete('Tricorder', $dbh);
dba_close();
3.5 dba_exists()
3.5.1 說明
bool dba_exists ( string $key , resource $handle ) 檢查key是否存在
3.5.2 引數
string $key key值
resource $handle 資料庫handler, 通過呼叫 dba_open(), dba_popen() 函式返回
3.5.3 返回值
key存在返回TRUE, 否則返回FALSE
3.5.4 示例
$dbh = dba_open( "./data/products", "c", "db4" )
or die( "Couldn't open database" );
if (dba_exists('Tricorder', $dbh)) {
$res_del = dba_delete('Tricorder', $dbh);
}
dba_close();
3.6 dba_replace()
3.6.1 說明
bool dba_replace ( string $key , string $value , resource $handle ) 替換或者插入記錄3.6.2 引數
string $key 要替換的key,如果可以不存在,就插入
string $value 要替換的值
resource $handle 資料庫handler, 通過呼叫 dba_open(), dba_popen() 返回
3.6.3 返回值
如果成功則返回 TRUE,失敗則返回 FALSE。
3.6.4 示例
$dbh = dba_open( "./data/products", "c", "db4" )
or die( "Couldn't open database" );
dba_insert("Tricorder", "55.50", $dbh);
dba_replace("Tricorder", "66.60", $dbh);
dba_close($dbh);
3.7 dba_firstkey()
3.7.1 說明
string dba_firstkey ( resource $handle ) 獲取資料庫第一條記錄的key值,從新設定庫內部的指標3.7.2 引數
resource $handle 開啟的資料庫handler, 通過dba_open(), dba_popen() 返回
3.7.3 返回值
成功返回key值,失敗返回FALSE
3.7.4 示例
$dbh = dba_open( "./data/products", "c", "db4" )
or die( "Couldn't open database" );
echo dba_firstkey($dbh); // print "Sonic Screwdriver"
dba_close();
3.8 dba_nextkey()
3.8.1 說明
string dba_nextkey ( resource $handle ) 獲取當前指標指向的下一條記錄的key值3.8.2 引數
resource $handle 開啟的資料庫handler, 通過呼叫dba_open(),dba_popen() 返回
3.8.3 返回值
成功返回key值, 失敗返回FALSE
3.8.4 示例
$dbh = dba_open( "./data/products", "c", "db4" )
or die( "Couldn't open database" );
echo dba_firstkey($dbh); //print "Sonic Screwdriver"
echo dba_nextkey($dbh); //print "Tricorder"
dba_close();
3.9 dba_handlers()
3.9.1 說明
array dba_handlers ([ bool $full_info ] ) 獲取支援的handlers列表
3.9.2 引數
bool $full_info 開啟/關閉在結果集中顯示全部資訊,預設是FALSE
3.9.3 返回值
返回一個數據庫handler的陣列,假如full_info設定為TRUE,返回的陣列以handler名字為鍵值,版本資訊為值,否則返回一個索引陣列,
3.9.4 示例
$dbh = dba_open( "./data/products", "c", "db4" )
or die( "Couldn't open database" );
print_r(dba_handlers());
// 預設引數,列印如下
Array
(
[0] => gdbm
[1] => cdb
[2] => cdb_make
[3] => db4
[4] => inifile
[5] => flatfile
)
print_r(dba_handlers(true));
// 引數為true,列印如下
Array
(
[gdbm] => GDBM version 1.8.3. 10/15/2002 (built Oct 22 2008 11:30:17)
[cdb] => 0.75, $Revision: 1.10.2.1.2.3 $
[cdb_make] => 0.75, $Revision: 1.9.2.1.2.1 $
[db4] => Berkeley DB 4.5.20: (September 20, 2006)
[inifile] => 1.0, $Revision: 1.14.2.1.2.3 $
[flatfile] => 1.0, $Revision: 1.14.2.1.2.1 $
)
3.10 dba_list()
3.10.1 說明
array dba_list ( void ) 獲取開啟的所有資料庫列表
3.10.2 引數
void 無引數
3.10.3 返回值
一個聯合陣列, resourceid => filename
3.11 dba_popen()
3.11.1 說明
resource dba_popen ( string $path , string $mode [, string $handler [, mixed $... ]] ) 以長連結方式開啟資料庫3.11.2 引數
參考dba_open() 函式
3.11.3 返回值
成功返回資料庫handler, 否則返回FALSE
bool dba_optimize ( resource $handle ) 優化資料庫
3.12.2 引數
resource $handle 開啟的資料庫handler, 通過呼叫dba_open(),dba_popen()返回
3.12.3 返回值
如果成功則返回 TRUE,失敗則返回 FALSE。
3.13 dba_sync()
3.13.1 說明
bool dba_sync ( resource $handle ) 資料庫的同步
3.13.2 引數
resource $handle 開啟的資料庫handler,通過呼叫dba_open(),dba_popen()返回
3.13.3 返回值
如果成功則返回 TRUE,失敗則返回 FALSE。
3.14 dba_close()
3.14.1 說明
void dba_close ( resource $handle ) 關閉一個dba資料庫
3.14.2 引數
resource $handle 開啟的資料庫handler,通過呼叫dba_open(),dba_popen() 返回
3.14.3 返回值
無
4. 使用db4,和gdbm的效率比較
檔案1,開啟dba資料庫,handler設定為db4
檔案2,開啟dba資料庫,handler設定為gdbm
檔案1,檔案2 迴圈寫入100條記錄,取出100記錄,刪除100條記錄,所有的時間(單位為秒)如下:
檔案1: 檔案2:
寫入時間::0.44283866882324 寫入時間::2.2147016525269
讀取時間::0.046286106109619 讀取時間::0.037073612213135
刪除時間: 0.00073099136352539 刪除時間: 0.00082588195800781
由此看以看出: 讀取,刪除的時間基本差不多,使用db4寫入的速度是比gdbm快5倍左右,
5.db 版本
db-4.5.20.NC.tar.gz