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() 为 path
建立一个数据库实例,使用 handler
以 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"未打开 确定 确定 确定 确定 确定 确定 确定 确定 mode
= "rl"确定 确定 等待 false 非法 非法 非法 非法 mode
= "wl"等待 false 等待 false 非法 非法 非法 非法 mode
= "rd"非法 非法 非法 非法 确定 确定 等待 false mode
= "wd"非法 非法 非法 非法 等待 false 等待 false
- 确定:第二次调用将成功。
- 等待:第二次调用将等待直到对第一次调用 dba_close()。
- false:第二次调用返回 false。
- 非法:您不得混合
"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
。
如果成功,则返回 Dba\Connection 实例,如果失败,则返回 false
。
版本 | 描述 |
---|---|
8.4.0 | 现在返回 Dba\Connection 实例;以前,返回的是 资源。 |
8.2.0 |
添加了 flags 。 |
8.2.0 |
handler 现在可以为空。 |
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,而对另一种使用 btree。
因此,由于 Apache 和 PHP 没有选择 Berkeley DB 方法的选项,因此您运气不佳。
从 GDBM 1.8.3 版本开始,GDBM 的底层 open 调用在具有 flock() 的系统上使用非阻塞调用 flock()。因此,使用 "rd" 或 "wd" 锁定模式的调用将返回错误(“不能是读取器”或“不能是写入器”),而不是等待。请改用 "rl" 或 "wl",以使 PHP 在 GDBM 外部执行自己的锁定。
如果您遇到一些奇怪的错误,例如
dba_open(): myDbFilename.db : Permission denied
你可能正在 Windows 机器上使用 PHP。你需要确保满足以下条件
1) 使用数据库文件的绝对路径。相对路径会导致锁定问题。
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 系统的不兼容性。