PHP から Firebird をアクセス(セットアップ編)

 このドキュメントは、PHP で Firebird を使うための設定方法と、 簡単な確認に関して書いてあります。
 ちなみに、Firebirdはすでにインストール済みであることが前提となっています ので、未インストールの方は、クイックスタートやFB付属のドキュメントを読んで、 インストールを完了させてください。
 対応 PHP のバージョンは、PHP4.3.8となっています。バージョンによっては 多少内容が変わってきますので注意が必要です。

このページのコンテンツ:

概要

 PHP から Firebird にアクセスするには、PHPの InterBase関数を使用する 方法と、Unified ODBC 関数 を使用する方法があります。  それぞれに利点がありますので、環境と必要に応じて使い分けるのが吉 でしょう。

  • InterBase関数
    • 利点
      • 専用なので細かな制御が可能。速度も期待できる。
    • 欠点
      • 環境によってはFB1.5ネイティブにアクセスできない。 (IB6/FB1.0互換となる場合がある)
        この場合、VARCHAR使用時に速度面で多少不利という面もあるが、 LinuxでFB1.5のみの環境ではPHPに組み込むためのコンパイルが多少面倒。 将来的には改良されるかも。
      • (Windows上では)ODBCに比べてお手軽さで劣る。
      • 他系列のデータベースエンジンへの変更は面倒な作業となる。
  • Unified ODBC 関数
    • 利点
      • Windows版PHPバイナリ配布版の場合、最初から組込み済みなので、 お手軽に使用できる。
      • ODBCは(特にWindows上では)データベースへのメジャーなインターフェース として認知されていると思われる。
      • 標準インタフェースなので、データベースエンジンの変更が多少楽になる。
    • 欠点
      • Firebird特有の細かな操作は出来ない。
      • ODBCドライバをインストールする必要がある。ドライバ自体は無料で使用できる。
      • Linux上ではメジャーなインターフェースとは必ずしも言えないだろう。

インストールと設定に関して

 ApacheなどのWebサーバや、PHPをインストールします。ApacheやPHP自体の 入手やインストールに関してはここではあまり詳しく触れません。 インストールや設定に関することは、あくまでFirebirdを使用するときに 注意することが主体となっています。

 Apacheに関してはJAPAN APACHE USERS GROUP に情報がありますし、それ以外にも良いサイトが沢山検索できます。
 PHPに関しては、日本PHPユーザ会にある PHPマニュアル中の インストールに詳しく 書かれていますので、そちらも参考にして下さい。

Windows系OSでのインストールと設定

 Windows系OSの場合は、どちらもバイナリを入手してインストールとなる場合が 多いでしょう。ここでは、Windowsでは一般的な方法と思われる、 PHP、DBクライアント共にモジュールとして動的にロードするように設定する方法 について書きます。

Apacheのインストール

 Apacheにはインストーラパッケージ(*.msi)がありますので、それを使用しての インストールを前提としています。

 Apacheはインストーラを起動し、インストール先のパスなどの質問に答えて インストールしてください。
 Apacheの起動方法はは自動起動・手動起動のどちらでも構いませんが、設定変更後 の再起動の手順は当然変わってきます。自動起動の場合は再起動のメニューが 出来ますのでそれを使用します。手動起動の場合、手動で一回終了(Ctrl+Cなどで) させた後に再度手動起動という手順になるでしょう。
 IISなどのApache以外のWebサーバも使用できますが、その場合の手順はこの ドキュメントに書かれている手順とは変わってきます。

PHPの手動インストールと設定

 PHPは動的ロードを使用するために、インストーラ版(*.exe)の方ではなく、ZIP で圧縮されたものをダウンロードし、手動でインストールを行うこととします。
 PHPは動的ロード用のモジュール版を使いたいので多少複雑です。

  • ダウンロードしたzipを適当なフォルダ(例えばC:\など)に展開します。
     展開すると、"php-4.3.8-Win32"のようなディレクトリが作られますので、その ディレクトリ以下の全内容を、PHPをインストールしたいディレクトリ(C:\PHPなど) にコピーします。
  • 展開したディレクトリにある"php.ini-recommended"を元にして、"php.ini"という ファイル名のコピーを作成します。リネームでも良いのですが、後々のためにデフォルト の設定を残しておいた方が良いでしょう。
  • php本体とphp.iniのシステムディレクトリへのコピー
     php4ts.dll と、コピー後に修正を施した php.ini を、Windowsのシステム ディレクトリにコピーします。例えば、WindowsNT/2000の場合は "C:\WINNT\SYSTEM32"、 WindowsXPの場合は "C:\WINDOWS\SYSTEM32" などになります。 Windowsのインストールディレクトリが変更してある場合は、それに合わせて変更 して下さい。

    ※Webサーバ起動時に、Webサーバのプログラムがコピーしたphp.iniにアクセスできる 必要があります。 WindowsNT系のOSの場合は、ファイルのアクセス権限にも注意が必要です。

Apacheの設定

 PHPマニュアルによると、Windows版では SAPI系の動的モジュールでの動作が安定 しているとのことで、性能面とセキィリティ面でも動的モジュールでの使用が推奨 されているようです。
 Apacheの設定は、インストールディレクトリ下のconfディレクトリにある、 設定ファイル"httpd.conf"を変更することにより行います。
 設定変更が完了したら、忘れずに Apache を再起動してください。

PHPを動的モジュール(DSO)としてロードして使用する場合

 使用するWebサーバにあったモジュール(dll)を選択します。
 使用モジュールの対応は次のとおりです。

php4apache.dllApache 1.3.x 向け
php4apache2.dllApache 2.0.x 向け
php4isapi.dllIIS/PWS ISAPI互換向け
(Apacheでも一応使用可能?)
php4nsapi.dllNetscape/iPlanet NSAPI互換向け

 選択したモジュールを使用するように、以下のような記述を設定ファイル中の 適当な位置に追加します。適当な位置とは、例えばファイルの最後や、似た設定 がなされてる場所付近ということです。
 ただし、ClearModuleListディレクティブよりも後にする必要があります。

# PHP モジュール関係
LoadModule  php4_module c:/PHP/sapi/php4apache.dll
AddModule   mod_php4.c
AddType     application/x-httpd-php     .php

 これで、拡張子 .php のファイルはPHPスクリプトが含まれていることを認識 するようになります。

PHPをCGIとして使用する場合

 以下のような記述を設定ファイル中の適当な位置に追加します。 PHPをインストールしたパス(c:/PHP/)は、環境に合わせて変更が必要です。

ScriptAlias /php/ "c:/PHP/"
AddType application/x-httpd-php .php .phtml
Action application/x-httpd-php "/php/php.exe"

 2行目の AddTypeは既に http.confにコメントアウト化して記述済みかもしれません。 その場合はコメントを外してください。

インストールと設定の補足説明:ODBCを使用する場合

 ODBCを使用する場合は、 IBPhoenix Open Source ODBC Driver より、最新のODBCドライバを入手してインストールします。インストールは、 質問に答えて行くだけですので非常に簡単です。
 インストールが完了したら、コントロールパネルの管理ツールを使用して ODBC の設定も行います。スクリプトでは、ここで設定したデータソース名 (Data Source Name : DSN)を使用してアクセス先を特定します。
 ODBCに関しては、このサイト (Firebird用ODBCドライバのインストール) も参考になるでしょう。

 Windows用PHPの場合、コピーにより作成した php.ini に対し変更を行わなくても、ODBC経由でのデータベース操作は行えます。
 もしも設定を変更する必要がある場合は、php.iniファイル中の、

;;;;;;;;;;;;;;;;;;;
; Module Settings ;
;;;;;;;;;;;;;;;;;;;

 の下にある、

[ODBC]

 で始まる項目にODBCの設定項目が有りますので、それを変更します。
 詳細の内容は、PHPマニュアルの Unified ODBC 関数 にある「実行用の設定」を参照して下さい。 とりあえず、よく設定すると思われるのは持続的接続に関する以下2項目でしょう。

; Allow or prevent persistent links.
odbc.allow_persistent = On

; Check that a connection is still valid before reuse.
odbc.check_persistent = On

 odbc.allow_persistentは、持続的接続(odbc_pconnect)を使用するときには On を設定する必要があります。また、その場合は odbc.check_persistent は On に 変更したほうがより安全と言えるでしょう。

 設定変更後はWebサーバ(Apache)の再起動などを行い設定を反映する必要が あります。

インストールと設定の補足説明:専用関数を使用する場合

 動的にFB/IB用のモジュールを読み込むためには、php.iniの変更が必要です。  FB/IB用のエクステンションを動的にロードするようにします。パスの指定などは、 PHPを展開したディレクトリに合わせて設定してください。

  • Extensionを読み込むパスの設定変更
; Directory in which the loadable extensions (modules) reside.
;extension_dir = "./"

 これを

; Directory in which the loadable extensions (modules) reside.
extension_dir = "c:\php\extensions\"

 のように変更します。

  • ロードモジュールのコメントアウトを有効な文に変更
;extension=php_interbase.dll

 これのコメントを取り去り、

extension=php_interbase.dll

 のように変更します。

  • シングルクォートに関する変更
     これは設定しないでも動くようですが、PHPマニュアル上では注意事項と なっていますので、今回のように InterBase関数 を使う場合には変更しておいた方がいいかもしれません。
; Use Sybase-style magic quotes (escape ' with '' instead of \').
magic_quotes_sybase = Off

 を

; Use Sybase-style magic quotes (escape ' with '' instead of \').
magic_quotes_sybase = On

 のように変更します。

Linux系でのインストールと設定

 Linux系OSの場合は、どちらもソースを入手してコンパイルする場合が 多いでしょう。 ここでは、Apacheのインストール自体にはまったく触れません。 インストール済みの Apache を使用するか、またはディストリビューション に合ったパッケージで導入して下さい。ただし、DSOを使用できるように 構成された Apache の使用を前提としています。
 PHPはDSOでロードするものとし、IB専用関数を使用できるように設定を行う 場合とします。

 対応する Firebird のバージョンは 1.0.x です。
 Firebird 1.5.1 の場合は、データベースがデフォルトでインストールされる ディレクトリが/opt/firebirdと変更されています。また、バージョンの問題で コンパイルが上手くいかない場合もありますので、その場合は トラブルシューティングを見てください。

PHPのインストール

 PHPのソースを日本PHPユーザ会のサイトから リンクを辿って入手します。その後、入手したソースを作業用のディレクトリに 解凍します。作業用ディレクトリの場所は、自分のローカルディレクトリ下でも なんら問題ありません。

$ tar xvzf php-4.3.8.tar,gz

 最後の "make install"によるインストールはスーパーユーザで行う必要が あるので、"su"コマンドなどを使用してあらかじめスーパーユーザーになって おきましょう。
 configure を実行して、InterBase関数 サポートを組込みます。configureの細かい使用法は、"./configure --help"で ヘルプが出ますので、そちらを確認してください。
 下の例は、makeやインストールまで行っています。

# cd ../php-4.3.8
# ./configure --with-apxs=/usr/local/apache/bin/apxs \
--with-interbase=/opt/interbase --enable-mbstring \
--enable-mbstr-enc-trans --enable-mbregex
# make
# make install

※1 最近のPHPはデフォルトで MySQL のサポートが組み込まれています。 不要な場合は configure に --without-mysql オプションを追加することで 削除できます。省メモリ重視の場合には役立ちます。
※2 --with-interbase=/opt/interbase の /opt/interbaseは、データベースが インストールされたディレクトリを表します。
※3 一部のディストリビューションでは、 InterBase関数 サポート組込み済みのパッケージが提供されているそうです。 configureが面倒という人は、探してみるのも良いかもしれません。

PHPの設定

 PHPのディレクトリにある"php.ini-recommended"を元にして、"php.ini"という ファイル名のコピーを作成します。リネームでも良いのですが、後々のためにも デフォルトの設定は残しておいた方が良いでしょう。
 作成した php.ini を編集することにより、設定を行います。
 作成したphp.iniに対して特に何も変更を行わなくても動作します。  しかし、PHPマニュアルを読む限りでは、変更を行った方が良いという項目が一つ ありますので、変更を行った方が良いかもしれません。
 詳しくは、シングルクォートに関する変更を読んで 下さい。

 設定が決まったら、php.iniを然るべき場所にコピー(またはシンボリックリンク を作成)します。

# cp php.ini /usr/local/lib/php.ini

Apcheの設定追加

 拡張子が ".php" となっているファイルを PHP スクリプトだと認識するように、 Apacheを設定します。
 次の2行、または初めの1行のみを設定ファイル(httpd.conf)に追加します。

AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

 必要に応じて、ディレクトリインデックスに項目を追加することも出来ます。 (もしあれば既存の)行に、"index.php" を追加することで設定できます。

DirectoryIndex index.php index.html

 すべての設定が完了したら、Apache の再起動を行ってください。これは Linuxのバージョンやディストリビューションで変わりますが、例えば次の ようなコマンドになるでしょう。

# /etc/init.d/httpd restart

動作確認

 PHP+Apacheの動作確認と、データベースサポートの組込み及び動作確認の 2種類の項目について書きます。
 データベースサポートの確認では、 Unified ODBC 関数の場合と InterBase関数の場合の 2例を挙げています。
 いずれも、データベースやドライバの設定は事前に isql などを使用して 行っておく必要があります。

phpinfoによる設定の確認(PHP自体の動作確認)

 PHPの設定情報を見る機能で、動作や組込みの状態を確認します。

 ここで作成するスクリプトファイルは、クラックにも利用可能なシステムに 関する詳細な情報が出力されます。そのため、使用後にそのまま放置すると セキュリティ上の重大な弱点になる可能性が有ります。 使用後は忘れずに削除するか、あらかじめ類推されることのない特殊な ファイル名を設定するなどの対策が必須です。

 次のような内容のPHPスクリプトファイルを、適当な名前で Apache の htdocs 下などに作成します。(例えば、/usr/local/apache/htdocs/info.php)

<? phpinfo(); ?>

 次に、IEその他のWebブラウザを立ち上げて、PHPに関する設定情報が表示 されるかを確認します。(参照URLは、例えば http://localhost/info.php)
 情報表示が行われたら、その中に "interbase" という題のついた表が存在する こと、及びその表にある項目 "interbase Support" が "enabled" になっている ことを確認します。
 PHPの設定が上手くいっていない場合は、項目名自体が出ないなどの症状が 現れます。その場合は、設定項目の見直しと、適切なディレクトリに php.ini が設定されているか確認してください。

※ コマンドライン上で、"php -i" を実行した場合も同じような情報が(HTMLにより) 表示されます。ただし、これはあくまでコマンドライン用での環境が表示されて おり、Webサーバから呼び出されたときとは食い違いが出る場合があります。
 これは、Apache などの Webサーバ上で動作する時と、読み込んでいる設定ファイル (php.ini)の存在するパスが異なっている場合があるためです。
 設定ファイルのパスも同時に表示されますので確認してください。

Unified ODBC 関数での動作確認

 PHPにUnified ODBC 関数が 正常に組み込まれており、かつFirebird及び ODBC ドライバが動作しているかを 確認します。 具体的には、odbc_connect()を呼び出して、接続自体が成功することを 確認します。
 例えば、次のような内容のスクリプトファイルを作成し、Webブラウザで 動作を確認してみてください。データソース名やユーザ名などは環境に合わせて 設定を行う必要があります。ちなみに、このスクリプトのデータベース名は、 Windows環境向けです。
※テストで使用するデータベースや、それに関連付けられたデータソース名(FB_TEST)は、事前に isql や ODBC ドライバの設定画面などで準備しておいて下さい。


ファイル名 : odbc_connect.php

<HTML>
<HEAD>
<TITLE>PHP + Firebird / Interbase test (ODBC接続)</TITLE>
</HEAD>
<BODY>
<H3>FB(ODBC) Connect test.</H3>
<?php
// DB アカウント定義
define("DBNAME","FB_TEST");      // データソース名
define("DBUSER","BBSUSER");      // 接続ユーザ名
define("DBPASSWORD","xo2z3qwa"); // パスワードの設定

// DB 接続
$dbh = odbc_connect(DBNAME, DBUSER, DBPASSWORD);
if ($dbh == FALSE) {
    echo 'データベースと接続できません。<BR>';
} else {
    echo 'データベースとの接続に成功しました。<BR>';
    // DB 切断
    odbc_close($dbh);
}
?>

</BODY>
</HTML>

 接続に成功すれば、ブラウザ上に「データベースとの接続に成功しました。」 と表示されるはずです。
 odbc_connect()関数が存在しないなどのエラー(通常は英文)が出力された場合は、 スクリプトのタイプミスもしくは PHP 設定ミスなどが考えられます。 トラブルシューティングを参照して下さい。

InterBase関数の動作確認

 PHPにInterBase関数が 正常に組み込まれており、かつFirebirdが動作しているかを確認します。 具体的には、ibase_connect()を呼び出して、接続自体が成功することを 確認します。
 例えば、次のような内容のスクリプトファイルを作成し、Webブラウザで 動作を確認してみてください。データベース名やユーザ名などは環境に合わせて 設定を行う必要があります。ちなみに、このスクリプトのデータベース名は、 Windows環境向けです。
※テストで使用するデータベース(TESTDB.FDB)は、事前に isql などを使用して作成しておいて下さい。


ファイル名 : fbconnect.php

<HTML>
<HEAD>
<TITLE>PHP + Firebird / Interbase test (接続)</TITLE>
</HEAD>
<BODY>
<H3>FB Connect test.</H3>
<?php
// DB アカウント定義
define("DBNAME","c:\db\TEST.FDB"); // データベース名
define("DBUSER","SYSDBA");         // 接続ユーザ名
define("DBPASS","masterkey");      // パスワード

// DB 接続
$dbh = ibase_connect(DBNAME,DBUSER,DBPASS,"EUCJ_0208");
if ($dbh == FALSE) {
    echo 'データベースと接続できません。<BR>';
} else {
    echo 'データベースとの接続に成功しました。<BR>';
    // DB 切断
    ibase_close($dbh);
}
?>

</BODY>
</HTML>

 接続に成功すれば、ブラウザ上に「データベースとの接続に成功しました。」 と表示されるはずです。
 ibase_connect()関数が存在しないなどのエラー(通常は英文)が出力された場合は、 スクリプトのタイプミスもしくは PHP 設定ミスなどが考えられます。 トラブルシューティングを参照して下さい。

トラブルシューティング

PHPがコンパイルできない

 主に Linux 系の情報です。

  • パスの指定ミス
     configure 時のパス指定などを見直してください。FB1.5の場合、デフォルトの インストールパスが、/opt/interbase から /opt/firebird に変更されています。
     ただし、すれ違いによりそれでも上手くいかない場合がありますので、その場合は 次項を見てください。
  • FB1.5とPHPのすれ違い
     ※旧バージョンのPHP/FBでは発生していましたが、Firebird 1.5.2 以降では 解決されている模様です。参考のために残してありますが、基本的には問題 にはならないことがほとんどであるはずです。
     FB 1.5 と PHP でのすれ違いにより、FB1.5で用意されたリソースでは上手く 行かない場合があります。
     解決策としては、とりあえず FB 1.0.x がインストールされた状態で PHP を コンパイルした後に、FB 1.0 をアンインストールし、FB 1.5.x をインストール するという方法があります。
     または FB 1.0 の環境(/opt/interbase下)を適当な場所にコピーして保存して おき、configure時にその場所を指定する方法もあります。
     この対処を行った場合、PHPとデータベースエンジン間の処理がIB6/FB1.0互換 となりFB1.5の場合と比べて多少性能が落ちる場合もあります。

Apacheの起動時に警告が出る

  • mod_php4.cに関する警告
     例えば、次のような警告です。
    [warn] module mod_php4.c is already added, skipping

 Apache の構成時に最初から mod_php4.c が組み込まれているようです。 該当する行をコメントにして下さい

LoadModule  php4_module e:/PHP/sapi/php4apache.dll
AddModule   mod_php4.c
AddType     application/x-httpd-php     .php

 コメントアウト化↓

LoadModule  php4_module e:/PHP/sapi/php4apache.dll
#AddModule   mod_php4.c
AddType     application/x-httpd-php     .php

phpinfo()の表示が出ない

  • URL(特にポート番号)の指定を確認してください。
  • Apacheの設定ファイルを確認してください。
  • スクリプトの設置場所やタイプなどにミスがないか確認してください。
  • httpヘッダを見ることが出来るブラウザでヘッダを参照し、起動しているPHPの バージョンなどを確認してください。 (Windows なら httpc のようなコマンドラインブラウザがあります。)
  • PHPをコマンドラインで動作させて、PHPが動作することを確認してください。
     具体的には、コマンドラインより、
$ php -i

 を実行してみてください。

InterBase関数が使用できない

 InterBase関数が使用できない というエラー(英文)が出た場合です。interbaseサポートが組み込まれていない場合 などに出ます。

  • スクリプトの設置場所やタイプなどにミスがないか確認してください。
  • phpinfo()の表示を確認して、interbase に関する項目とサポートが有効になって いることを確認してください。
     使用中の設定ファイルのパスも表示されますので、意図した設定ファイルを参照 しているか、及びその設定ファイル自体にも問題がないか確認してください。
  • 設定ファイルは正しいはずなのに、phpinfo()で表示される内容が食い違う場合は 次項の、「PHPの設定が正しく反映されない」も読んでください。

PHPの設定が正しく反映されない

 確認した設定ファイルの内容がうまく反映されていないように思われる場合です。 PHPの組込み手順やApacheのインストール方法の違いなどにより発生する場合がある ようです。

  • コマンドラインの"php -i"を実行して、設定ファイルの内容が正しく反映されて いるかを確認してください。うまく反映されない場合は、設定ファイルの記述が 間違っているか、意図した設定ファイルが使用されていません。
  • コマンドラインでは正しいのにWebサーバ経由だと上手く反映されない場合は、 設定ファイルを読み込むパスが、何らかの理由により Apache 本体の ホームディレクトリになっている為かもしれません。Apache のホームディレクトリ (例えば、C:\Apache Group\Apacheなど)に php.ini を置いて、Apache を再起動 して様子を見てください。

その他

 上手く動作しない場合は、gds32.dll や fbclient.dll(1.5以降) などがファイル として存在し、かつ実行パスが通っているかを確認してください。Firebird には、 クライアント環境をセットアップするコマンド(instclient.exe)もあります。