dba_open

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

dba_open打开数据库

描述

dba_open(
    字符串 $path,
    字符串 $mode,
    ?字符串 $handler = null,
    整数 $permission = 0644,
    整数 $map_size = 0,
    ?整数 $flags = null
): 资源|false

dba_open() 使用 handlerpathmode 模式建立数据库实例。

参数

path

通常是文件系统中的普通路径。

mode

它表示读访问权限的 r,表示对已存在数据库的读写访问权限的 w,表示读写访问权限,如果数据库不存在则创建的 c,以及表示创建、截断和读写访问权限的 n。数据库以 BTree 模式创建,其他模式(如 Hash 或 Queue)不受支持。

此外,您可以使用下一个字符设置数据库锁定方法。使用 l 通过 .lck 文件锁定数据库,或者使用 d 锁定数据库文件本身。重要的是,您的所有应用程序都必须一致地执行此操作。

如果要测试访问权限,并且不想等待锁定,可以添加 t 作为第三个字符。如果您确定不需要数据库锁定,则可以使用 - 而不是 ld。如果没有使用 dl-,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() 的所有可选参数,并可以代表它们执行操作。如果 handlernull,则调用默认处理程序。

permission

传递给驱动程序的可选 整数 参数。它与 chmod()permissions 参数具有相同的含义,默认值为 0644

db1db2db3db4dbmgdbmndbmlmdb 驱动程序支持 permission 参数。

map_size

传递给驱动程序的可选 整数 参数。它的值应该是操作系统页面大小的倍数,或者为零,以使用默认映射大小。

只有 lmdb 驱动程序接受 map_size 参数。

flags

传递给数据库驱动程序的标志。如果为 null,则将提供默认标志。目前,只有 LMDB 驱动程序支持以下标志 DBA_LMDB_USE_SUB_DIRDBA_LMDB_NO_SUB_DIR

返回值

成功时返回一个正数句柄,失败时返回 false

错误/异常

handlernull,但没有默认处理程序时,将返回 false,并发出 E_WARNING 级别的错误。

变更日志

版本 描述
8.2.0 添加了 flags
8.2.0 handler 现在可以为 null。
7.3.14, 7.4.2 lmdb 驱动程序现在支持额外的 map_size 参数。

参见

添加备注

用户贡献的备注 6 个备注

up
1
doppelbauer at gmail dot com
17 年前
Windows 不支持锁定数据库。您可以使用 $_ENV 来确定操作系统

$locking = (stripos($_ENV['OS'],'windows') === false ? 'd' : 'l');
up
0
dracoirs at gmail dot com
14 年前
Apache 不支持 Berkeley DB Btree,因此如果您要使用 DBM 进行 Apache 身份验证,则不能将 db4 作为数据库类型。

gdbm 似乎可以正常工作,即使它据说是使用 Btree 而不是 hash。这让人不禁要问,为什么 Apache 会对一个 dbmtype 使用 hash,而对另一个 dbmtype 使用 btree。

因此,由于 Apache 和 PHP 没有选择 Berkeley DB 方法的选项,您就无能为力了。
up
0
mskala at ansuz dot sooke dot bc dot ca
16 年前
从 GDBM 1.8.3 版本开始,GDBM 的底层打开调用对具有 flock() 的系统使用 flock() 的非阻塞调用。因此,使用 "rd" 或 "wd" 锁定模式的调用将返回错误("Can't be reader" 或 "Can't be writer"),而不是等待。使用 "rl" 或 "wl" 代替,让 PHP 在 GDBM 之外执行自己的锁定。
up
0
xy ät affenkrieger.de
18 年前
如果您遇到一些奇怪的错误,例如
dba_open(): myDbFilename.db : Permission denied
那么您可能是在 Windoze 机器上使用 PHP。您必须确保满足以下条件

1) 对您的 db 文件使用绝对路径。相对路径会导致锁定问题
2) 指定锁定模式 - 这是模式参数的第二个字符,否则打开 dba 文件将导致多个通知/警告等。

最后,还有一般性说明
3) 始终使用本网站上的英文 PHP 文档——翻译版本通常非常过时,并且会遗漏重要信息

希望对您有所帮助,Nils。
up
-2
trohit at blue bottle dot com
16 年前
这是一个使用 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);
?>
up
-5
cbemerine at gmail dot com
14 年前
请注意,如果 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 系统的兼容性问题。
To Top