PHP Conference Japan 2024

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
): Dba\Connection|false

dba_open()path 建立一个数据库实例,使用 handlermode 模式。

参数

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"
未打开 确定 确定 确定 确定 确定 确定 确定 确定
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() 的所有可选参数,并可以代表它们执行操作。如果 handlernull,则调用默认处理程序。

permission

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

db1db2db3db4dbmgdbmndbmlmdb 驱动程序支持 permission 参数。

map_size

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

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

flags

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

返回值

如果成功,则返回 Dba\Connection 实例,如果失败,则返回 false

错误/异常

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

变更日志

版本 描述
8.4.0 现在返回 Dba\Connection 实例;以前,返回的是 资源
8.2.0 添加了 flags
8.2.0 handler 现在可以为空。
7.3.14, 7.4.2 lmdb 驱动程序现在支持额外的 map_size 参数。

参见

添加注释

用户贡献的注释 6 条注释

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

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

尽管 gdbm 似乎工作正常,即使它据称使用的是 Btree 而不是 hash。这让人想知道为什么 Apache 会对一种 dbmtype 使用 hash,而对另一种使用 btree。

因此,由于 Apache 和 PHP 没有选择 Berkeley DB 方法的选项,因此您运气不佳。
mskala at ansuz dot sooke dot bc dot ca
16 年前
从 GDBM 1.8.3 版本开始,GDBM 的底层 open 调用在具有 flock() 的系统上使用非阻塞调用 flock()。因此,使用 "rd" 或 "wd" 锁定模式的调用将返回错误(“不能是读取器”或“不能是写入器”),而不是等待。请改用 "rl" 或 "wl",以使 PHP 在 GDBM 外部执行自己的锁定。
xy ät affenkrieger.de
18 年前
如果您遇到一些奇怪的错误,例如
dba_open(): myDbFilename.db : Permission denied


你可能正在 Windows 机器上使用 PHP。你需要确保满足以下条件

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

最后,一个一般的说明
3) 始终使用本网站上的英文 PHP 文档 - 翻译通常非常旧并且缺少重要的信息。

希望对您有所帮助,Nils。
trohit at blue bottle dot com
17 年前
这是一个使用 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);
?>
cbemerine at gmail dot com
15 年前
请注意,如果 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