再びエクステンションをビルドする方法の解説に戻ります。今回は、単純な構造のデータを管理するのに便利な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はデータファイルを操作するためのライブラリです。
DBMではキーによる高速な検索が可能になっているため、頻繁に検索しなければならない転送先のような情報はDBMを使うのが、UNIX/Linuxでは普通のやり方となっています。第19回では、Apacheの認証情報を格納するデータベースとして、ApacheからDBMを利用する方法を解説しています。そちらも参照してください。
このようにDBMはさまざまな場所で使われており、PHPから利用したいというニーズも少なくありません。また、RDBMSを使うまでもないような簡単なデータなどは、DBMで管理するのが手軽です。
ちなみに、DBMではデータ形式として不足だが、RDBMSのサーバを用意するまでもないといったような、RDBMSとDBMの中間に当たるような用途には、SQLiteがお薦めです。SQLiteはDBMのようにサーバが不要で、データファイルを書き換えるだけのRDBMSです。SQLiteは第30回で解説したように、PHPでも標準で使えるようになっています。
さて、このDBMですが、RDBMSにはMySQLやPostgreSQLなどがあるように、いくつかの実装があります。DBAエクステンションで対応しているDBMには、dbm、ndbm、gdbm、db2、db3、db4、cdb、flatfile、inifile、qdbmがあります。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の概要が理解できたところで、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への組み込み方法とともに紹介します。
次回も引き続き、エクステンションの紹介です。よく使われるエクステンションも残り少なくなってきましたので、次回でエクステンションの解説は最後になります。
Copyright © ITmedia, Inc. All Rights Reserved.