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
为 path
以 mode
模式建立数据库实例。
path
通常是文件系统中的普通路径。
mode
它表示读访问权限的 r
,表示对已存在数据库的读写访问权限的 w
,表示读写访问权限,如果数据库不存在则创建的 c
,以及表示创建、截断和读写访问权限的 n
。数据库以 BTree 模式创建,其他模式(如 Hash 或 Queue)不受支持。
此外,您可以使用下一个字符设置数据库锁定方法。使用 l
通过 .lck 文件锁定数据库,或者使用 d
锁定数据库文件本身。重要的是,您的所有应用程序都必须一致地执行此操作。
如果要测试访问权限,并且不想等待锁定,可以添加 t
作为第三个字符。如果您确定不需要数据库锁定,则可以使用 -
而不是 l
或 d
。如果没有使用 d
、l
或 -
,dba 将锁定在数据库文件上,就像使用 d
一样。
注意:
一个数据库文件只能有一个写入者。当您在 Web 服务器上使用 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 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: 第二次调用将成功。
- wait: 第二次调用将等待,直到对第一次调用 dba_close()。
- false: 第二次调用将返回 false。
- illegal: 您不能将
"l"
和"d"
修饰符混合用于mode
参数。
handler
用于访问 path
的 处理程序 的名称。它将传递给 dba_open() 的所有可选参数,并可以代表它们执行操作。如果 handler
为 null
,则调用默认处理程序。
permission
传递给驱动程序的可选 整数 参数。它与 chmod() 的 permissions
参数具有相同的含义,默认值为 0644
。
db1
、db2
、db3
、db4
、dbm
、gdbm
、ndbm
和 lmdb
驱动程序支持 permission
参数。
map_size
传递给驱动程序的可选 整数 参数。它的值应该是操作系统页面大小的倍数,或者为零,以使用默认映射大小。
只有 lmdb
驱动程序接受 map_size
参数。
flags
传递给数据库驱动程序的标志。如果为 null
,则将提供默认标志。目前,只有 LMDB 驱动程序支持以下标志 DBA_LMDB_USE_SUB_DIR
和 DBA_LMDB_NO_SUB_DIR
。
成功时返回一个正数句柄,失败时返回 false
。
版本 | 描述 |
---|---|
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,因此如果您要使用 DBM 进行 Apache 身份验证,则不能将 db4 作为数据库类型。
gdbm 似乎可以正常工作,即使它据说是使用 Btree 而不是 hash。这让人不禁要问,为什么 Apache 会对一个 dbmtype 使用 hash,而对另一个 dbmtype 使用 btree。
因此,由于 Apache 和 PHP 没有选择 Berkeley DB 方法的选项,您就无能为力了。
从 GDBM 1.8.3 版本开始,GDBM 的底层打开调用对具有 flock() 的系统使用 flock() 的非阻塞调用。因此,使用 "rd" 或 "wd" 锁定模式的调用将返回错误("Can't be reader" 或 "Can't be writer"),而不是等待。使用 "rl" 或 "wl" 代替,让 PHP 在 GDBM 之外执行自己的锁定。
如果您遇到一些奇怪的错误,例如
dba_open(): myDbFilename.db : Permission denied
那么您可能是在 Windoze 机器上使用 PHP。您必须确保满足以下条件
1) 对您的 db 文件使用绝对路径。相对路径会导致锁定问题
2) 指定锁定模式 - 这是模式参数的第二个字符,否则打开 dba 文件将导致多个通知/警告等。
最后,还有一般性说明
3) 始终使用本网站上的英文 PHP 文档——翻译版本通常非常过时,并且会遗漏重要信息
希望对您有所帮助,Nils。
这是一个使用 dba_open 函数的简单示例
<?php
$id = dba_open("/tmp/test.db", "n", "gdbm");
if (!$id) {
echo "dba_open failed\n";
exit;
}
dba_replace("key", "This is an example!", $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( "Couldn't open Database" );
?>
而是使用
<?php
$dbh = dba_open( "./data2/productz", "n", "cdb" ) or die( "Couldnt open Database" );
?>
在 /var/log/apache2/error.log 中生成此错误消息
[Sun Sep 06 04:18:15 2009] [error] [client 192.168.1.125] PHP Warning: dba_open(./data2/productz,c) [<a href='function.dba-open'>function.dba-open</a>]: Driver initialization failed for handler: cdb: Update operations are not supported in /var/www/projects/testcdb-c.php on line 43
查看 dba_handlers() 下的用户贡献注释,了解您的 MySQL 版本支持哪些 DBA 处理程序,以及有关使用 “cdb” 编译的 DBA 系统的信息
另请查看 dba_replace() 下的用户贡献注释,了解与使用 “cdb” DBA 处理程序编译的 MySQL 系统的兼容性问题。