使用 perl DB_File 创建文件时如何指定 BerkeleyDB 的版本?

How to specify version of BerkeleyDB when creating file using perl DB_File?

我们的 perl 脚本和 PHP 脚本之间似乎在 BerkeleyDB 中遇到了版本不兼容问题。我们的 perl 脚本生成 BDB 而我们的 php 脚本只是读取它们。

我们的 perl 脚本使用 DB_File 创建 BDB 文件:

use DB_File;
$DBFILE="output.db";
tie(%db, "DB_File", $DBFILE, O_RDWR | O_CREAT, 0644)
    or warning("Could not open db file '$DBFILE'");

这之前创建了一个类型的文件:

$ file output.db
output.db: Berkeley DB (Hash, version 9, native byte-order)

但是,在升级 sys-libs/db 和 DB_File 之后,现在创建的文件类型为:

$ file output.db
output.db: Berkeley DB (Hash, version 10, native byte-order)

在系统的另一端,我们有一个 PHP 脚本。当升级发生时,我们的 PHP 代码(基于 dba_open())开始抱怨版本:

Notice:  dba_open(): output.db: unsupported hash version: 10 in dbread.php on line 16

我试过升级PHP,但似乎还不支持版本10。

有没有办法告诉 perl 的 DB_File 在创建数据库时创建特定版本?

不,无法告诉 perl 的 DB_File 创建特定版本,AFAIK libdb 本身没有该功能

如果您 compile/link 反对版本 4.x 的 libdb,那么 DB_File 只能使用该版本

因此,如果您需要使用 libdb-4.x 的 DB_File,您将不得不降级或在不同的 @INC 目录中安装另一个副本

安装时这是您编辑的文件https://metacpan.org/source/PMQS/DB_File-1.835/config.in

只需更改 DBNAME = -ldb-2.4.10 以匹配您的 php 安装使用的版本

使用 https://metacpan.org/pod/ExtUtils::MakeMaker#INSTALL_BASE then tell perl where to find it with https://metacpan.org/pod/perlrun#PERL5LIB

指定不同的安装目录

https://metacpan.org/pod/local::lib 也记录了这个