連載
» 2011年11月11日 00時00分 UPDATE

仕事で使える魔法のLAMP(30):PHPでデータベースを使う準備をする

Webアプリケーションにはデータベースが付き物です。今回はエクステンションを有効にしてMySQLを使う準備をします(編集部)

[山口晴広,株式会社イメージズ・アンド・ワーズ]

多様なDBMSを同じ方法で操作できるようにする抽象化レイヤ

 第28回から、一般に使用頻度の高いPHPエクステンションを使えるようにしていく作業を続けています。文字列処理、XML処理、そしてコマンドライン版のPHPのインタラクティブシェルといった機能を有効にするためのエクステンションについて解説してきました。今回はデータベース関連のエクステンションを有効にして、データベースを使う準備をします。

 PHPではさまざまなデータベース管理システム(DBMS)を利用できます。その利用方法は大きく2つに分けられます。それぞれのDBMS向けのクライアントライブラリをそのままPHPで使う方法と、DBMSの機能を抽象化したものを扱う方法です。PHPのドキュメントを見ると、以上に挙げた2つの項目に分かれています(図1)。

図1 PHPドキュメントのデータベースサポートの目次。抽象化レイヤと、ベンダ固有のモジュールに分かれている 図1 PHPドキュメントのデータベースサポートの目次。抽象化レイヤと、ベンダ固有のモジュールに分かれている

 DBMSの機能を抽象化するメリットとしては、DBMSが変わっても同じように扱えるという点が挙げられます。共通の操作インターフェイスを通して、それぞれのDBMSを操作できるのです。この共通の操作インターフェイスを抽象化レイヤと呼びます(図2)。いわば、さまざまなDBMSの操作法の最大公約数のようなものです。

図2 抽象化レイヤとアプリケーション、各データベースクライアントライブラリの関係 図2 抽象化レイヤとアプリケーション、各データベースクライアントライブラリの関係

 こうすることで、特定のDBMSに依存しないアプリケーションを作成できるようになります。ただし、抽象化レイヤを経由すると、DBMSのすべての機能を使えなくなる可能性があります。抽象化レイヤを使わないと、アプリケーションが特定のDBMSに依存することになりますが、クライアントライブラリ固有の機能をすべて使えるというメリットがあります。

 PHPではこの抽象化レイヤとして、PHP Data Objects(PDO)Open Database Connectivity(ODBC)DBAの3種類があります。このうちDBAはいわゆるリレーショナルデータベースで使うものではないので、解説は次回以降とします。PDOとODBCは同じようなエクステンションに見えますが、ODBCの方はPHP以外の言語でも使える、汎用的な抽象化レイヤです。

 PDOはPHPの内部で抽象化を実現していますが、ODBCのほうはPHPでは抽象化は行いません。ODBCのライブラリで抽象化を行っています。PHPを使うLAMP環境ではPDOを使うことが多いと思いますので、ODBCについての解説は省略します。ODBCはマイクロソフトが策定したものであり、主にWindows上で使うものです。

 PDOを使うには、PDOエクステンションと各データベースのクライアントライブラリを橋渡しするドライバが必要です。ドライバはPDOの一部としてPHPに同梱されています。有名なDBMSなら大体の場合、PDOを利用できます。一方、ドライバが存在しない場合は、そのDBMSではPDOは利用できません。configureスクリプトのヘルプでPDO関連のオプションを見れば、対応しているDBMSが分かります。

個々のDBMSに向けたエクステンション

 前述の通り、抽象化レイヤに対応DBMSを組み合わせる方法とは別に、個々のDBMS向けのエクステンションがあります。これらのエクステンションを使うには、それぞれのDBMSのクライアントライブラリが必要です。

 本連載はLAMPのMに当たるMySQLをターゲットとしていますので、MySQLのエクステンションを有効にしなければなりません。しかしそれには、MySQLのクライアントライブラリが必要です。一般に、DBMSのクライアントライブラリを使うには、DBMSをインストールしなければなりません。つまり、PHPの前にDBMSをビルド、インストールしておく必要があるということになります。ただし、2つ例外があります。SQLiteMySQLです。

 SQLiteはサーバを必要としない、アプリケーション組み込み型DBMSで、PHPに付属しています。ビルドするのに外部ソフトウェアが必要になることはありません。ただし、Apache HTTP Server(以下Apache)にもSQLiteを組み込むことができるということに注意してください。その場合、その場合、PHPに付属するSQLiteは使わず、Apacheがリンクしているのと同じライブラリを使わなければなりません。第28回で解説したPCREと同じですね。なお、SQLiteのエクステンションは標準で有効なので、同梱のものを使うなら特にconfigureスクリプトで指定する必要はありません。

 そして2つ目の例外であるMySQLです。mysqlndというクライアントライブラリがPHPに付属しているのです。mysqlndはMySQL Native Driverの略です。これは本来のMySQLのクライアントライブラリとは別物で、PHPに特化したクライアントライブラリです。従って、MySQLをインストールしていない状態でもMySQLのエクステンションを有効にできます。なおかつ処理性能も優れているので、PHPの次のバージョンである5.4からはmysqlndがMySQL向けの標準クライアントライブラリとなる予定です。

 PHPのMySQLエクステンションには注意すべき点がもう1つあります。エクステンションが2つあるのです。1つは元からあるもの、もう1つは改良版です。後者はmysqliというエクステンションです。ここでは両方ビルドすることにします。

 MySQLエクステンションを有効にするには「--with-mysql」、mysqliエクステンションは「--with-mysqli」を指定します。さらにややこしいことに、それぞれ「=」の後に指定する内容が異なります。前者はMySQLのインストールディレクトリ、後者はMySQLの設定スクリプトを指定するのです。

 仮に、MySQLを「/opt/mysql-5.5.17」にインストールしてあるとすると、configureの引数は次のようになります。

(略)
  --with-mysql=/opt/mysql-5.5.17 \
  --with-mysqli=/opt/mysql-5.5.17/bin/mysql_config \
(略)

 この例はMySQL本来のクライアントライブラリを使う場合ですが、前述のmysqlndを使うには、次のようにします。

(略)
  --with-mysql=mysqlnd \
  --with-mysqli=mysqlnd \
(略)

PDOを有効にする

 次にPDOの設定です。PDOそのものは標準で使えるようになっています。PDOの各データベース用ドライバを有効にすれば準備完了です。なお、前述のSQLiteのPDOドライバはSQLiteエクステンションと同様、標準で有効になっています。

 PDOのMySQLドライバは「--with-pdo-mysql」で有効にします。指定するのはインストールディレクトリになります。また、ここでもmysqlndを指定することもできます。MySQLに関連するエクステンションがいろいろ登場したので整理すると、図3のようになります。

図3 MySQLのエクステンションやドライバの関係 図3 MySQLのエクステンションやドライバの関係

 ほかのDBMSに向けたエクステンションに比べるといろいろあって複雑ですが、PHPとMySQLは最もよく使う組み合わせです。互換性を維持しつつ積極的な改善を進めた結果、このようになったわけです。現実的な実用性を優先するPHPらしい部分です。

MySQLエクステンションのためにzlibを有効にする

 configureスクリプトのヘルプを参照すると、MySQLエクステンションを使うにはzlibが必要であることが分かります。zlibは第15回でも説明した、圧縮のためのライブラリです。

 また、zlibを使うためのzlibエクステンションというものもあります。ここでこのエクステンションを有効にしておきます。

 zlibエクステンションは「--with-zlib」、zlibの場所は「--with-zlib-dir」で指定します。zlibライブラリはApacheをビルドしたときにインストールが済んでいるはずです。

まとめると結局こうなる!

 ここまでの内容をまとめましょう。ApacheとPHPが必要とする外部ソフトウェアのOSパッケージをインストールするコマンドは次のようになります。1行目がApacheのビルドに必要なもの、2行目は第28回の内容、3行目は第29回の内容です。今回は新たに追加したパッケージはありません。

$ 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スクリプトのコマンドラインは以下の通りになります。

./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 \
  2>&1 | tee configure_log.txt

 次回も引き続き、よく使うエクステンションについて解説していきます。

著者紹介

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



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

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

Focus

- PR -

RSSについて

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

メールマガジン登録

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