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 系統不相容的問題。