PHPでデータベースを使う準備をする:仕事で使える魔法のLAMP(30)
Webアプリケーションにはデータベースが付き物です。今回はエクステンションを有効にしてMySQLを使う準備をします(編集部)
多様なDBMSを同じ方法で操作できるようにする抽象化レイヤ
第28回から、一般に使用頻度の高いPHPエクステンションを使えるようにしていく作業を続けています。文字列処理、XML処理、そしてコマンドライン版のPHPのインタラクティブシェルといった機能を有効にするためのエクステンションについて解説してきました。今回はデータベース関連のエクステンションを有効にして、データベースを使う準備をします。
PHPではさまざまなデータベース管理システム(DBMS)を利用できます。その利用方法は大きく2つに分けられます。それぞれのDBMS向けのクライアントライブラリをそのままPHPで使う方法と、DBMSの機能を抽象化したものを扱う方法です。PHPのドキュメントを見ると、以上に挙げた2つの項目に分かれています(図1)。
DBMSの機能を抽象化するメリットとしては、DBMSが変わっても同じように扱えるという点が挙げられます。共通の操作インターフェイスを通して、それぞれのDBMSを操作できるのです。この共通の操作インターフェイスを抽象化レイヤと呼びます(図2)。いわば、さまざまなDBMSの操作法の最大公約数のようなものです。
こうすることで、特定の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つ例外があります。SQLiteとMySQLです。
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のようになります。
ほかの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
次回も引き続き、よく使うエクステンションについて解説していきます。
- CMakeでMySQLをビルドしてみる
- MySQLのビルドに欠かせないCMakeを準備する
- いよいよMySQL編、ソースからビルドすべきか?
- PHPでセッションを利用するための設定
- クライアントがアクセスできる範囲を制限する
- エラーメッセージをどう扱うか?
- ファイルのアップロードを制限する
- リクエストデータを受け取る変数の扱い
- マジッククオート機能には頼らない
- 安全を考えてPHPの実行時設定を調整する
- Apacheの設定ファイルでPHPの設定を変える
- PHPの設定ファイルを作って配置してみる
- PHPスクリプトを実行できるようにする準備
- PHPエクステンション組み込みの仕上げ
- 単純なデータを管理するDBMを使えるようにする
- エクステンションの組み込み状況を確認する
- PHPでデータベースを使う準備をする
- XMLを処理できるようにする
- エクステンションを有効にしてビルドに挑戦!
- PHPテスト失敗の原因を追究する
- 早速PHPをビルド! そしてテスト!
- PHP編に突入! まずはソースをダウンロード
- 設定ファイルを作成してApacheを動作させる
- 設定ファイルや公開ドキュメントの配置を考える
- 1つのサーバに複数の仮想サーバ?
- Apacheの設定ファイルを記述する前に
- サードパーティのApacheモジュールをビルドする
- 認証DBにアクセスするライブラリを組み込む
- Apache同梱ソフトウェアに引数を渡してビルド
- OpenSSLをビルドしてApacheで利用する
- proxyやsslのモジュールを使ってみる
- ライブラリが足りなくてビルドできないときは?
- Apache HTTP Serverのビルドを始めよう
- configureでソフトウェア固有の設定を変更してみる
- configureの設定を変更してみる
- 配布パッケージの中身と、configureの役目を知る
- ダウンロードファイルが真正なものであるかを確認
- Makefileをいろいろ書き換えながらビルドしてみよう
- makeを使ってソフトウェアをビルドしてみよう
- ダイナミックリンクとスタティックリンク
- 「ビルド」という作業は何を指しているのか
- 公開鍵認証でsshを安全に使う
- sshを便利にする公開鍵暗号
- アクセス制限の設定とCentOSのアップデート
- サーバに接続して、一般ユーザーのアカウントを作る
- LAMP環境、自分で作りませんか?
Copyright © ITmedia, Inc. All Rights Reserved.