単純なデータを管理するDBMを使えるようにする仕事で使える魔法のLAMP(32)

再びエクステンションをビルドする方法の解説に戻ります。今回は、単純な構造のデータを管理するのに便利なDBMを使えるようにする方法を解説します(編集部)

» 2011年11月24日 00時00分 公開
[山口晴広株式会社イメージズ・アンド・ワーズ]

単純な構造のデータを管理するならDBM

 第28回から、一般に利用頻度が高いPHPのエクステンションを有効にしていく作業について説明しています。今回のテーマはDBAエクステンションです。第30回でデータベースの抽象化について解説しましたが、そのときDBAエクステンションの存在について言及しました。DBAは、一般にDBMと呼ぶデータベースのための抽象化レイヤです。抽象化レイヤの概念については第30回で詳しく説明しています。

 DBMは、MySQLに代表されるような、いわゆるリレーショナルデータベース管理システム(以下RDBMS)とは異なる仕組みを持つデータベースで、UNIX/Linuxにおいては古くから利用されています。

 例えば、メールの転送先を格納するための「/etc/aliases」ファイルなどがDBM化したデータになっています。実際の「/etc/aliases」はテキストファイルで、変更後に「newaliases」というコマンドを実行しないと変更内容が有効になりません。このコマンドによって、テキストファイルからDBMのデータベースを更新するようになっているためです。

 RDBMSではテーブルを使ってデータを格納しますが、DBMはキーと値のペアでデータを格納します。転送先の例で説明すると、転送元のアドレスがキーになり、転送先が値となります(図1)。また、ほとんどのRDB管理システムはクライアント/サーバ方式ですが、DBMはデータファイルを操作するためのライブラリです。

図1 dbmのデータ形式と利用方法 図1 dbmのデータ形式と利用方法

 DBMではキーによる高速な検索が可能になっているため、頻繁に検索しなければならない転送先のような情報はDBMを使うのが、UNIX/Linuxでは普通のやり方となっています。第19回では、Apacheの認証情報を格納するデータベースとして、ApacheからDBMを利用する方法を解説しています。そちらも参照してください。

 このようにDBMはさまざまな場所で使われており、PHPから利用したいというニーズも少なくありません。また、RDBMSを使うまでもないような簡単なデータなどは、DBMで管理するのが手軽です。

 ちなみに、DBMではデータ形式として不足だが、RDBMSのサーバを用意するまでもないといったような、RDBMSとDBMの中間に当たるような用途には、SQLiteがお薦めです。SQLiteはDBMのようにサーバが不要で、データファイルを書き換えるだけのRDBMSです。SQLiteは第30回で解説したように、PHPでも標準で使えるようになっています。

DBAエクステンションで対応できるDBM

 さて、このDBMですが、RDBMSにはMySQLやPostgreSQLなどがあるように、いくつかの実装があります。DBAエクステンションで対応しているDBMには、dbmndbmgdbmdb2db3db4cdbflatfileinifileqdbmがあります。dbmとndbmは、UNIX環境で使われているものであり、Linuxでは使いません。Linuxでその代わりとなるのが、GNUのDBM実装であるgdbmです。

 db2〜db4は、いずれもOracle Berkley DBを指しています。末尾の数字はバージョンを指します。Oracle Berkley DBのバージョンに応じたものを選んで使うことになるわけです。

 cdbは、qmailというMTA(Mail Transfer Agent)などが採用しているDBMです。このDBMはデータの変更に対応していません。一部のデータを変更したいときも、全体を再作成することになるのです。こうすることで、軽量でデータ読み出しが高速になっています。PHPに付属しており、標準で有効になります。最後のqdbmも高速さを売りにしているDBMです。

 flatfile、inifileは、その名の通り実際にはDBMではありません。単なるテキストファイルにデータを格納するものです。inifileはWindowsの設定ファイルなどでよく利用されている、INI形式のテキストです。つまり、DBAエクステンションを通してテキストファイルを書き換えるということになります。

 DBMはデータを素早く検索できることがメリットですが、これら2つの形式を使った場合はそのメリットは得られません。一方で、データファイルがテキスト形式なので直接内容を確認でき、テキストエディタで内容を書き換えられるというメリットがあります。ほかのDBMのデータファイルは、バイナリ形式になっており、直接中身を見ても確認できません。

 処理速度を求めない状況で、テキストのデータファイル編集で楽をしたいといったケースや、アプリケーション開発中だけテキストのDBAを使うことで、データの中身の確認を容易にするといった目的で利用します。

 flatfile、inifileはDBMではなく、PHP独自のものであり、PHPに付属しています。DBAエクステンションを有効にすれば自動的に利用可能になります。

DBAエクステンションをビルドしよう

 DBAの概要が理解できたところで、configureスクリプトの引数を作って実際にビルドしていきます。Apacheをビルドする際に、DBMとしてOracle Berkley DBを組み込みましたので、PHPでも同じくOracle Berkley DBを有効にします。この場合、Apacheと同じライブラリがリンクされるように注意してください。

 configureのヘルプでは、DBA関連の引数は次のようになっています。

$ ./configure --help | grep DBA
  --enable-dba            Build DBA with bundled modules. To build shared DBA
  --with-qdbm[=DIR]         DBA: QDBM support
  --with-gdbm[=DIR]         DBA: GDBM support
  --with-ndbm[=DIR]         DBA: NDBM support
  --with-db4[=DIR]          DBA: Oracle Berkeley DB 4.x or 5.x support
  --with-db3[=DIR]          DBA: Oracle Berkeley DB 3.x support
  --with-db2[=DIR]          DBA: Oracle Berkeley DB 2.x support
  --with-db1[=DIR]          DBA: Oracle Berkeley DB 1.x support/emulation
  --with-dbm[=DIR]          DBA: DBM support
  --without-cdb[=DIR]       DBA: CDB support (bundled)
  --disable-inifile         DBA: INI support (bundled)
  --disable-flatfile        DBA: FlatFile support (bundled)

 特に難しいところはありません。Oracle Berkeley DBのバージョンですが、パッケージで「db4-devel」をインストールしていますので、「--with-db4」を指定すれば良いということになります。

 ここでコマンドラインをまとめます。最終的なパッケージのインストールのためのコマンドラインは次のようになります。これは前回(第30回)のものと変わっていません。

$ sudo yum install zlib-devel openssl-devel db4-devel pcre-devel
$ sudo yum install libicu-devel gettext-devel
$ sudo yum install readline-devel libxml2-devel libxslt-devel

 PHPのconfigureスクリプトは、DBA関連を追加し、次のようになります。

./configure 
  --prefix=/opt/php-5.3.8 
  --with-apxs2=/opt/apache-httpd-2.2.21/bin/apxs 
  --enable-mbstring 
  --enable-intl 
  --with-icu-dir=/usr 
  --with-gettext=/usr 
  --with-pcre-regex=/usr 
  --with-pcre-dir=/usr 
  --with-readline=/usr 
  --with-libxml-dir=/usr/bin/xml2-config 
  --enable-soap 
  --enable-wddx  
  --with-xmlrpc 
  --with-xsl=/usr 
  --with-mysql=mysqlnd 
  --with-mysqli=mysqlnd 
  --with-pdo-mysql=mysqlnd 
  --with-zlib=/usr 
  --with-zlib-dir=/usr 
  --enable-dba 
  --with-db4=/usr 
  2>&1 | tee configure_log.txt

組み込みに成功したか確認

 前回、意図した通りにエクステンションの組み込みができているかどうかをコマンドラインから確認する方法を紹介しました。同じ手順で、DBAエクステンションを確認してみます。

 関数「phpinfo()」の出力のうち、DBAエクステンションの部分は次のようになっています。

dba
 
DBA support => enabled
Supported handlers => cdb cdb_make db4 inifile flatfile
 
Directive => Local Value => Master Value
dba.default_handler => flatfile => flatfile

 標準で組み込まれるcdb、inifile、flatfileに加え、db4が有効になっていることが見て取れます。cdb_makeというものもありますが、これはcdbのバリエーションで、データファイルを新規に作成するときに使うものです。

 また、標準の形式がflatfileになっていることも分かります。DBAを利用するときは、どのDBMを使うのか指定できますが、この場合は特別指定しなければflatfileを使うことになります。開発中だけ切り替えるといったことをしたい場合は、この設定を切り替えればよいのです。設定方法については、次回以降にPHPのApacheへの組み込み方法とともに紹介します。

 次回も引き続き、エクステンションの紹介です。よく使われるエクステンションも残り少なくなってきましたので、次回でエクステンションの解説は最後になります。

著者紹介

株式会社イメージズ・アンド・ワーズ
代表取締役
山口晴広(やまぐち はるひろ)



「仕事で使える魔法のLAMP」バックナンバー

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。