2024 年 PHP 日本研討會

dba_open

(PHP 4, PHP 5, PHP 7, PHP 8)

dba_open開啟資料庫

描述

dba_open(
    字串 $path,
    字串 $mode,
    ?字串 $handler = null,
    整數 $permission = 0644,
    整數 $map_size = 0,
    ?int $flags = null
): Dba\Connection|false

dba_open() 會建立一個資料庫實體,使用 handlermode 模式存取 path

參數

path

通常是檔案系統中的正規路徑。

mode

它可以是 r 表示讀取存取,w 表示對現有資料庫的讀寫存取,c 表示讀寫存取,如果資料庫不存在則建立,以及 n 表示建立、截斷和讀寫存取。資料庫以 BTree 模式建立,其他模式(如 Hash 或 Queue)不受支援。

此外,您可以使用下一個字元設定資料庫鎖定方法。使用 l 使用 .lck 檔案鎖定資料庫,或使用 d 直接鎖定資料庫檔案。所有應用程式都必須一致地使用相同的方法,這非常重要。

如果您想要測試存取權限且不想等待鎖定,可以新增 t 作為第三個字元。如果您完全確定不需要資料庫鎖定,則可以使用 - 代替 ld。如果沒有使用 dl-,dba 將會像使用 d 一樣鎖定資料庫檔案。

注意事項:

一個資料庫檔案只能有一個寫入器。當您在網頁伺服器上使用 dba 且有多個請求需要寫入操作時,它們只能依序執行。此外,寫入期間不允許讀取。 dba 擴充功能使用鎖定來防止這種情況。請參閱下表

DBA 鎖定
已開啟 mode = "rl" mode = "rlt" mode = "wl" mode = "wlt" mode = "rd" mode = "rdt" mode = "wd" mode = "wdt"
未開啟 ok ok ok ok ok ok ok ok
mode = "rl" ok ok 等待 false 非法 非法 非法 非法
mode = "wl" 等待 false 等待 false 非法 非法 非法 非法
mode = "rd" 非法 非法 非法 非法 ok ok 等待 false
mode = "wd" 非法 非法 非法 非法 等待 false 等待 false
  • ok:第二次呼叫會成功。
  • 等待:第二次呼叫會等待,直到第一次呼叫的 dba_close() 被呼叫。
  • false:第二次呼叫會返回 false。
  • 非法:您不能在 mode 參數中混合使用 "l""d" 修飾符。

handler

用於存取 path處理器 名稱。它會傳遞所有給 dba_open() 的選用參數,並可代表它們執行操作。如果 handlernull,則會呼叫預設處理器。

permission

傳遞給驅動程式的選用 int 參數。它的意義與 chmod()permissions 參數相同,預設值為 0644

db1db2db3db4dbmgdbmndbmlmdb 驅動程式支援 permission 參數。

map_size

傳遞給驅動程式的選用 int 參數。其值應為作業系統頁面大小的倍數,或零,以使用預設的映射大小。

只有 lmdb 驅動程式接受 map_size 參數。

旗標

傳遞給資料庫驅動程式的旗標。如果是 null,則會提供預設旗標。目前,只有 LMDB 驅動程式支援以下旗標:DBA_LMDB_USE_SUB_DIRDBA_LMDB_NO_SUB_DIR

返回值

成功時返回一個 Dba\Connection 實例,失敗時返回 false

錯誤/例外

handlernull,但沒有預設處理程式時,會返回 false 並發出 E_WARNING 等級的錯誤。

更新日誌

版本 描述
8.4.0 現在返回一個 Dba\Connection 實例;以前返回的是一個 資源
8.2.0 新增了 flags 參數。
8.2.0 handler 現在可以為 null。
7.3.14, 7.4.2 lmdb 驅動程式現在支援額外的 map_size 參數。

另請參閱

新增註解

使用者貢獻的註解 6 則註解

1
doppelbauer at gmail dot com
18 年前
Windows 不支援鎖定資料庫。您可以使用 $_ENV 來判斷作業系統

$locking = (stripos($_ENV['OS'],'windows') === false ? 'd' : 'l');
0
dracoirs at gmail dot com
14 年前
Apache 不支援 Berkeley DB Btree,因此如果您想使用 Apache 進行 DBM 驗證,則無法使用 db4 作為資料庫類型。

儘管 gdbm 應該使用 Btree 而不是雜湊,但它似乎運作良好。這讓您想知道為什麼 Apache 會對一種 dbmtype 使用雜湊,而對另一種使用 Btree。

因此,由於 Apache 和 PHP 沒有選擇 Berkeley DB 方法的選項,所以您就沒轍了。
0
mskala at ansuz dot sooke dot bc dot ca
16 年前
從 GDBM 1.8.3 版開始,GDBM 底層的 open 呼叫在具有 flock() 的系統上使用非阻塞的 flock() 呼叫。因此,使用「rd」或「wd」鎖定模式的呼叫將返回錯誤(「無法成為讀取器」或「無法成為寫入器」),而不是等待。請改用「rl」或「wl」,讓 PHP 在 GDBM 外部進行自己的鎖定。
0
xy ät affenkrieger.de
18 年前
如果您遇到一些奇怪的錯誤,例如
dba_open(): myDbFilename.db : 權限被拒
那麼您可能是在 Windows 電腦上使用 PHP。您必須確保滿足以下條件

1) 使用資料庫檔案的絕對路徑。相對路徑會導致鎖定問題
2) 指定鎖定模式 - 這是 mode 參數的第二個字元,否則開啟 dba 檔案會導致一些通知/警告等等。

最後,一個一般性的注意事項
3) 請務必使用此網站上的英文 PHP 文件 - 翻譯版本通常過時且遺漏重要資訊。

希望有幫助,Nils。
-2
trohit at blue bottle dot com
17 年前
以下是一個使用 dba_open 函式的簡單範例

<?php

$id
= dba_open("/tmp/test.db", "n", "gdbm");

if (!
$id) {
echo
"dba_open 失敗\n";
exit;
}

dba_replace("key", "這是一個範例!", $id);

if (
dba_exists("key", $id)) {
echo
dba_fetch("key", $id);
dba_delete("key", $id);
}

dba_close($id);
?>
-5
cbemerine at gmail dot com
15 年前
請注意,如果 MySQL 是使用許多發行版常見的「cdb」DBA 處理器編譯選項建置的,則「c」建立旗標將無法運作。根據定義,cdb DBA 處理器針對讀/寫進行了優化,並且「不允許更新」。

<?php
$dbh
= dba_open( "./data2/productz", "c", "cdb") or die( "無法開啟資料庫" );
?>

改用

<?php
$dbh
= dba_open( "./data2/productz", "n", "cdb" ) or die( "無法開啟資料庫" );
?>

在 /var/log/apache2/error.log 中產生此錯誤訊息
[週日 9月 6日 04:18:15 2009] [錯誤] [客戶端 192.168.1.125] PHP 警告: dba_open(./data2/productz,c) [<a href='function.dba-open'>function.dba-open</a>]: 處理器的驅動程式初始化失敗: cdb: 在 /var/www/projects/testcdb-c.php 的第 43 行不支援更新操作

請參閱 dba_handlers() 下的使用者貢獻註釋,以查看您的 MySQL 版本支援哪些 DBA 處理器,並注意使用「cdb」編譯的 DBA 系統。

另請參閱 dba_replace() 下的使用者貢獻註釋,了解與 cdb DBA 處理器編譯的 MySQL 系統不相容的問題。
To Top