XXIV. (dbm 型の)データベース抽象化レイヤ関数

導入

これらの関数は、Berkeley DB 型データベースへのアクセス用の基本関数を 構成します。

これらの関数は、複数のファイルベースのデータベース用の抽象化レイヤです。 その機能は、Sleepycat Software's DB2 でサポートされているような近代的なデータベースの 機能のサブセットに制限されています(IBM の DB2 と混同しないでください。 このデータベースは、ODBC 関数 を通じてサポートされます)。

要件

各機能の動作は、使用するデータベースの実装に依存します。 dba_optimize() および dba_sync() のような関数は、特定のデータベースでは動作しますが、他のデータベースでは 機能しません。サポートされるdbaハンドラをダウンロードし、インストールする 必要があります。

表 1. DBAハンドラのリスト

ハンドラ注意
dbm dbm は最も古い(元祖の)Berkeley DB 型データベースです。可能なら ば使用しない方が良いでしょう。DB2 および gdbm に組み込まれている 互換性を保つための関数は、サポートされません。これは、実装されて いるのがソースレベルの互換性のみであり、元の dbm フォーマットを 処理することができないためです。
ndbm ndbm は、dbm に比べて新しく、dbm よりも柔軟です。 dbm 固有の制約の多くをまだ有しています(そのため、 推奨されません)。
gdbm Gdbm は、GNU データベースマネージャ です。
db2 DB2 は、Sleepycat Software's DB2 です。これは、「スタンドアローンおよびクライアント/サーバー アプリケーションの両方で高性能な組込みデータベースサポートを提供する プログラム用ツールキット」として記述されています。
db3 DB3 は、Sleepycat Software's DB3 です。
db4 DB4 は、Sleepycat Software's DB4 です。PHP 4.3.2 以降で利用可能です。
cdb cdb は「固定データベースの作成・読込み用の、高速で高信頼性の 軽量型パッケージ」です。これは qmail の作者によるものであり、 http://cr.yp.to/cdb.html にあります。 固定であるため、読込操作のみがサポートされます。 PHP 4.3.0 以降、内部的な cdb ライブラリにより(更新ではなく) 書き込みがサポートされています。
cdb_make PHP 4.3.0 以降、付属する cdb ライブラリを使用する場合に cdb ファイルの(更新ではなく)作成をサポートします。
flatfile これは、PHP 4.3.0 以降で利用可能で、古い dbm 拡張モジュールとの互換性の ためだけのものであり、使用するべきではありません。 しかし、ファイルがこの形式で作成された場所でこれを使用する ことができます。これは、configure が外部ライブラリを見付ける ことができない場合に生じます。
inifile これは PHP 4.3.3 以降で利用可能で、PHP スクリプトから php.ini ファイルを書き換えられるようにします。ini ファイルを扱う場合は、 array(0=>group,1=>value_name) のような配列、あるいは "[group]value_name" のような文字列を渡します(group はオプションです)。 dba_firstkey()dba_nextkey() はキーを文字列形式で返しますが、PHP 5 以降で利用できる dba_key_split() を用いるとそれを配列形式に 変換できます。その際に FALSE を失うこともありません。
qdbm これは PHP 5.0.0 以降で有効です。qdbm ライブラリは http://qdbm.sourceforge.net にあります。

dba_open() または dba_popen() 関数を実行する際、引数にハンドラ名の一つを指定する必要があります。 実際に利用可能なハンドラのリストは、 phpinfo() または dba_handlers() をコールした際に表示されます。

インストール手順

設定オプション --enable-dba=shared を使用することにより、dbm 形式のデータベースをサポートする動的に ロード可能なモジュールを有効にして PHP を構築することができます。 また、PHP の configure 行に設定スイッチ --with-XXXX を指定することにより、少なくとも以下のハンドラの一つのサポートを 追加する必要があります。

警告

PHP の configuring とコンパイルを済ませたら、コマンドラインから次の テストを実行する必要があります: php run-tests.php ext/dba これは、指定したハンドラの組み合わせが動作するかどうかを調べます。 いちばん問題のあるのは dbmndbm の組み合わせで、これらは多くの場合何らかの衝突を引き起こします。 その原因は、いくつかのシステムではこれらのライブラリが他のライブラリの 一部となっていることで。configure 時のテストでは個々のハンドラについての 設定不備は調べられますが、それらの組み合わせについてはテストできません。

表 2. サポートされるDBAハンドラ

ハンドラconfigure のスイッチ
dbm dbm のサポートを有効にするには、 --with-dbm[=DIR] を追加します。

注意: dbm は一般的にはラッパで、しばしば失敗を引き起こします。 その動作をしっかり把握しており、ほんとうにそれを必要とする場合のみ dbm を使用するようにすべきです。

ndbm ndbm のサポートを有効にするには、 --with-ndbm[=DIR] を追加します。

注意: ndbm は一般的にはラッパで、しばしば失敗を引き起こします。 その動作をしっかり把握しており、ほんとうにそれを必要とする場合のみ ndbm を使用するようにすべきです。

gdbm gdbm のサポートを有効にするには、 --with-gdbm[=DIR] を追加します。
db2 db2 のサポートを有効にするには、 --with-db2[=DIR] を追加します。

注意: db2 は db3 および db4 とは同時に使えません。

db3 db3 のサポートを有効にするには、 --with-db3[=DIR] を追加します。

注意: db3 は db2 および db4 とは同時に使えません。

db4 db4 のサポートを有効にするには、 --with-db4[=DIR] を追加します。

注意: db4 は db2 および db3 とは同時に使えません。

注意: これは PHP 4.3.2 で追加されました。これ以前のバージョンでは、 --with-db3=DIR を使用し、 DIR に db4 ライブラリのパスを指定する必要する必要があります。 バージョン 4.3.0 より前の PHP では、4.1 以降のバージョンの db を使用することはできません。また、バージョン 4.1 から 4.1.24 までの db ライブラリは、どの PHP のバージョンでも利用できません。

cdb cdb のサポートを有効にするには、 --with-cdb[=DIR] を追加します。

注意: PHP 4.3.0 以降、付属する cdb ライブラリを使用するために DIR を省略することができます。この場合、cdb_make ハンドラが追加されます。 これにより cdb ファイルを作成したり、PHPのストリームを用いて ネットワーク上の cdb ファイルにアクセスできるようになります。

flatfile flatfile のサポートを有効にするには、 --with-flatfile を追加します。

注意: これは、古い dbm 拡張モジュール との互換性のために PHP 4.3.0 で追加されました。 このハンドラは、他のハンドラで必要とされるライブラリをひとつも インストールすることができない場合、そして、付属する cdb ハンドラを使用することができない場合にのみ使用してください。

inifile inifile のサポートを有効にするには、 --with-inifile を追加します。

注意: これは PHP 5.0.0 で追加されました。これにより Microsoft 形式の .ini ファイル(php.ini のような)を 読み書きできるようになります。

qdbm qdbm のサポートを有効にするには、 --with-qdbm[=DIR] を追加します。

注意: qdbm は dbm および gdbm とは同時に使えません。

注意: これは PHP 5.0.0 で追加されました。qdbm ライブラリは http://qdbm.sourceforge.net にあります。

注意: PHP 4.3.0 までは、db2 および db3 ハンドラの両方を追加することが できましたが、内部的に使用できるのは片方だけでした。 これは、両方のファイル形式を使用することができないことを意味します。 PHP 5.0.0 以降、このような設定ミスを回避するよう設定の確認が行われます。

実行時設定

設定ディレクティブは定義されていません。

リソース型

関数 dba_open() および dba_popen() は、指定したデータベースファイルに アクセスするためのハンドルを返します。このハンドルは、他の全ての dba 関数コールで使用されます。

定義済み定数

定数は定義されていません。

例 1. DBA の例

<?php

$id
= dba_open("/tmp/test.db", "n", "db2");

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);
?>

DBA はバイナリセーフであり、いかなる制限も受けません。しかし、 使用するデータベースの実装による全ての制約を継承します。

全てのファイルベースのデータベースは、完全に使用可能なものについて 新規に作成されたデータベースのファイルモードを設定する手段を、 提供する必要があります。 ファイルモードは、通常 dba_open() または dba_popen() に 4 番目の引数として渡されます。

dba_firstkey() および dba_nextkey() 関数を用いて全てのエントリに 連続的にアクセスすることができます。アクセスする際にデータベースを 変更できない可能性があります。

例 2. データベースへのアクセス

<?php

// データベースをオープンする

$key = dba_firstkey($id);

while (
$key != false) {
    if (
true) {          // 他の操作を後で行うためにキーを記憶する
        
$handle_later[] = $key;
    }
    
$key = dba_nextkey($id);
}

foreach (
$handle_later as $val) {
    
dba_delete($val, $id);
}

?>

目次
dba_close -- DBA データベースを閉じる
dba_delete -- キーが指す DBA エントリを削除する
dba_exists -- キーが存在するかどうかを確認する
dba_fetch -- キーが指すデータを取得する
dba_firstkey -- 最初のキーを取得する
dba_handlers -- 利用可能なハンドラの一覧を得る
dba_insert -- エントリを挿入する
dba_key_split --  文字列形式のキーを配列形式に分割する
dba_list -- オープンされている全データベースファイルのリストを得る
dba_nextkey -- 次のキーを取得する
dba_open -- データベースをオープンする
dba_optimize -- データベースを最適化する
dba_popen -- データベースを持続的にオープンする
dba_replace -- エントリを置換または挿入する
dba_sync -- データベースを同期する