Windows 不支援鎖定資料庫。您可以使用 $_ENV 來判斷作業系統
$locking = (stripos($_ENV['OS'],'windows') === false ? 'd' : 'l');
(PHP 4, PHP 5, PHP 7, PHP 8)
dba_open — 開啟資料庫
$path
,$mode
,$handler
= null
,$permission
= 0644,$map_size
= 0,$flags
= null
dba_open() 會建立一個資料庫實體,使用 handler
以 mode
模式存取 path
。
path
通常是檔案系統中的正規路徑。
mode
它可以是 r
表示讀取存取,w
表示對現有資料庫的讀寫存取,c
表示讀寫存取,如果資料庫不存在則建立,以及 n
表示建立、截斷和讀寫存取。資料庫以 BTree 模式建立,其他模式(如 Hash 或 Queue)不受支援。
此外,您可以使用下一個字元設定資料庫鎖定方法。使用 l
使用 .lck 檔案鎖定資料庫,或使用 d
直接鎖定資料庫檔案。所有應用程式都必須一致地使用相同的方法,這非常重要。
如果您想要測試存取權限且不想等待鎖定,可以新增 t
作為第三個字元。如果您完全確定不需要資料庫鎖定,則可以使用 -
代替 l
或 d
。如果沒有使用 d
、l
或 -
,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() 的選用參數,並可代表它們執行操作。如果 handler
為 null
,則會呼叫預設處理器。
permission
傳遞給驅動程式的選用 int 參數。它的意義與 chmod() 的 permissions
參數相同,預設值為 0644
。
db1
、db2
、db3
、db4
、dbm
、gdbm
、ndbm
和 lmdb
驅動程式支援 permission
參數。
map_size
傳遞給驅動程式的選用 int 參數。其值應為作業系統頁面大小的倍數,或零,以使用預設的映射大小。
只有 lmdb
驅動程式接受 map_size
參數。
旗標
傳遞給資料庫驅動程式的旗標。如果是 null
,則會提供預設旗標。目前,只有 LMDB 驅動程式支援以下旗標:DBA_LMDB_USE_SUB_DIR
和 DBA_LMDB_NO_SUB_DIR
。
成功時返回一個 Dba\Connection 實例,失敗時返回 false
。
版本 | 描述 |
---|---|
8.4.0 | 現在返回一個 Dba\Connection 實例;以前返回的是一個 資源。 |
8.2.0 |
新增了 flags 參數。 |
8.2.0 |
handler 現在可以為 null。 |
7.3.14, 7.4.2 | lmdb 驅動程式現在支援額外的 map_size 參數。 |
Windows 不支援鎖定資料庫。您可以使用 $_ENV 來判斷作業系統
$locking = (stripos($_ENV['OS'],'windows') === false ? 'd' : 'l');
Apache 不支援 Berkeley DB Btree,因此如果您想使用 Apache 進行 DBM 驗證,則無法使用 db4 作為資料庫類型。
儘管 gdbm 應該使用 Btree 而不是雜湊,但它似乎運作良好。這讓您想知道為什麼 Apache 會對一種 dbmtype 使用雜湊,而對另一種使用 Btree。
因此,由於 Apache 和 PHP 沒有選擇 Berkeley DB 方法的選項,所以您就沒轍了。
從 GDBM 1.8.3 版開始,GDBM 底層的 open 呼叫在具有 flock() 的系統上使用非阻塞的 flock() 呼叫。因此,使用「rd」或「wd」鎖定模式的呼叫將返回錯誤(「無法成為讀取器」或「無法成為寫入器」),而不是等待。請改用「rl」或「wl」,讓 PHP 在 GDBM 外部進行自己的鎖定。
如果您遇到一些奇怪的錯誤,例如
dba_open(): myDbFilename.db : 權限被拒
那麼您可能是在 Windows 電腦上使用 PHP。您必須確保滿足以下條件
1) 使用資料庫檔案的絕對路徑。相對路徑會導致鎖定問題
2) 指定鎖定模式 - 這是 mode 參數的第二個字元,否則開啟 dba 檔案會導致一些通知/警告等等。
最後,一個一般性的注意事項
3) 請務必使用此網站上的英文 PHP 文件 - 翻譯版本通常過時且遺漏重要資訊。
希望有幫助,Nils。
以下是一個使用 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);
?>
請注意,如果 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 系統不相容的問題。