PHP调用 Berkeley DB 有2种实现方式

1. 通过DBA系列函数来实现

  1. 编译PHP,–with-qdbm[=DIR] –enable-dba=shared

这样就能使用下面的方法了

$id = dba_open("/tmp/test.db", "n", "qdbm");
 
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);

发现的问题

  • 使用qdbm作为driver时,连续向数据库里加入1万篇长度为50K左右的文章,尝试多次都会造成数据库损坏。dba_open 就报错。没有找到类似mysql的修复方法。
  • 并发写时,数据库被锁死,其他进程读数据都不行 –难道是我没设置好?

结论:放弃此方法。

2.通过 php_db4实现:Berkeley DB with PHP

此模式使用Berkeley DB自带的PHP api,能使用比较底层的api

待解决问题

  • 测试大数据量时性能。比如数据库文件达到2G
  • 多库切换如何处理
  • 并发读写的处理;稳定性验证,是否会发生第一种方法下的数据库损坏。

实例:

$dbenv = new Db4Env();
$dbenv->set_data_dir("/data/www/cp/tmpdb4/");
$dbenv->open("/data/www/cp/tmpdb4/");

$db = new Db4($dbenv);
$db->open(null, 'fileName2', 'ddb_name2');
$counter = $db->get("counter");
print "Current value of counter is $counter\n";
$db->put("counter", $counter+1);

for($i=0; $i<1000; $i++ ) {
  $db->put(md5($i), "i: $i date:".date("Y-m-d H:i:s")." - md5:".md5($i) );
}
 
$i = 300;
$key = md5($i);

$cursor = $db->cursor(); //游标

$cursor->get($key, $val, DB_SET);  //设置游标的起始位置

$k = 0;
while( 0 === $cursor->get($key, $val, DB_NEXT) ) {   //遍历
        echo $k, ",  ", $key, " => ", $val, " \r\n";
        $k ++;
}

研究特性

  1. 简单的key-value, 100万写之花30秒 (10万大概只需要1秒)
  2. 从100万数据中读出1000条只花 0.0139
  1. 写10万数据:1.47s
  2. 从10万数据中读出100条:0.00135
database/berkeley_db.txt · 最后更改: 2009/08/13 17:19 由 kenvin
到顶部
chimeric.de = chi`s home Creative Commons License Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0 红麦软件 红麦软件