1. 程式人生 > >php操作dba的總結筆記

php操作dba的總結筆記

1.簡介Database (dbm-style) Abstraction Layer

這些函式是建立在訪問 Berkeley DB (伯克利資料庫)的基礎之上。

目前 PHP 支援的 DBA 資料庫包括:

  1. dbm:柏克萊發展的最早期 DBA 資料庫。
  2. ndbm:較新且較有彈性的 DBA。
  3. db3:由 Sleepycat 軟體開發的 DB3。
  4. db4:由 Sleepycat 軟體開發的 DB4,從php4.3.2開始支援。
  5. cdb:這是 qmail 作者開發快速可靠的 DBA,http://cr.yp.to/cdb.html.
  6. cdb_make
  7. flatfile
  8. inifile
  9. 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的擴充套件用鎖來防止同時操作,請看下錶:

DBA locking
already openmode = "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

3.12 dba_optimize()

3.12.1 說明

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