アーティクルID:40
最終更新日:2003/7/7
編集者:三浦しゅう(ウェブ担当)
ML投稿者:三浦しゅう、林務さん、天野 潔さん
参考・引用記事:Firebird1.5rc2と PHP4.3.x, RE: [Firebird-jp-general] Firebird1.5rc2と PHP4.3.x, Re: Firebird1.5rc2と PHP4.3.x <続 > , RE: [Firebird-jp-general] Re: Firebird1.5rc2と PHP4.3.x <続 > , Re: Firebird1.5rc2と PHP4.3.x <続 > , PHPからFirebirdを使うには, Re: PHPからFirebirdを使うには, Re: [Firebird-jp-general] Re: PHPからFirebirdを使うには , Re: PHPからFirebirdを使うには , TOMNEKO'S ROOM : http://homepage2.nifty.com/tomneko/tomneko_labo/tomneko_labo_5.html , DipMeshSystems : http://xdip.com/sylph/index.php?sylph_xsite=63 , http://xdip.com/sylph/index.php?sylph_xsite=64
先日から隙を見つけてはPHPの関連ソースコードなどを検討した結果、Firebird1.02からFirebird1.5rc2にあげても特に問題はないだろう、という見込みが立ったので、早速実験用サーバー(fb1.02+php4.3.1)にFirebird1.5rc2をインストールしてみました。ちょっとは身構えたものの…PHPからのアクセスは全然問題なし、、、、ibWebAdminも大味で言えば…動作しているようです。(ibWebAdminについてはキャラコード設定の動作に以前から疑問がある)Delphi6ent付属のInterBase6のibConsoleからのアクセスは
ユーザー管理などは使えないようでした。一応、自分のサイトに手順メモっておいたので、参考になるようなら参考にしてください。
http://xdip.com/sylph/index.php?sylph_xsite=64
※./configureの際のinterbaseオプションのディレクティブは「/opt/interbase」のままでもNPかと思いきや…動いていた理由はむしろそこにあったようです。念のためにfirebird1.02のリソースを/opt/interbaseに残していたので、以前のリソースで動作していたと思われます。で、とりあえずは特定できているポイントですがfirebirdインストールディレクトリ/include/の中に以前のものも1.5rc2もcのヘッダファイルが配置されているのですが、1.5rc2についてきているものではconfigureやmakeでエラーが起きます。コードの詳細はまだみていないのですが、とりあえずご報告です。※ちなみにかなり邪道ですが、1.5rc2を稼働させて、古いincludeでphpを構築すれば「とりあえず動いている」ことは確認済みです。
windowsでibwebadminを動かすとうまくいきませんね。IBOConsoleはちゃんとつながるんですが・・・。
動作しているサーバーは1.5だけど、クライアントライブラリは1.0.2が使用されているということですね?1.5の新フィーチャーを使用しなければそれでもOKなのかな?Windowsでは、GDS32.dllを入れ替え忘れてIBOConsoleを起動したりすると、サービスマネージャーに接続できないというエラーになってダメでした。isql.exeは古いモノでも大丈夫ですね。
SQL> show version;
ISQL Version: WI-V1.0.2.908 Firebird 1.0
Firebird/x86/Windows NT (access method), version "WI-T1.5.0.3233 Firebird
1.5 Release Candidate 1"
on disk structure version 10.1
ver.1.0.2のisql.exeでv1.5に接続するとこんな表示になります。ODSが10.1になっていますね。この状態でリモートのv1.0.2に接続するとこうなります。
SQL> show version;
ISQL Version: WI-V1.0.2.908 Firebird 1.0
Firebird/x86/Windows NT (access method), version "WI-V6.2.908 Firebird 1.0"
Firebird/x86/Windows NT (remote server), version "WI-V6.2.908 Firebird
1.0/tcp (svrxxx)/P10"
Firebird/x86/Windows NT (remote interface), version "WI-T1.5.0.3233 Firebird
1.5 Release Candidate 1/tcp (pcxxx)/P10"
on disk structure version 10.0
さらに、isql.exeのディレクトリにv1.0.2のgds32.dllを配置するとこうなります(当然か)
SQL> show version;
can't format message 17:10 -- message file C:\Program
Files\Borland\Interbase\/i
nterbase.msg not found
Firebird/x86/Windows NT (access method), version "WI-V6.2.908 Firebird 1.0"
Firebird/x86/Windows NT (remote server), version "WI-V6.2.908 Firebird
1.0/tcp (svrxxx)/P10"
Firebird/x86/Windows NT (remote interface), version "WI-V6.2.908 Firebird
1.0/tcp (pcxxx)/P10"
on disk structure version 10.0
interbase.msgが見つからないというエラーは、レジストリにインストールルートが無いので出ています。v1.0.2のinstregで登録するとでません。v1.5とv1.0.2はレジストリエントリが変更されているので、こうしても問題がおきることはありません。
正確にはサーバーは1.5が稼働していて、apacheのPHPモジュールのibase関数群が、1.0.2のヘッダファイルを元に構築されているという感じですね。つまり…1.5サーバーに1.0.2準拠の関数群でアクセスしている感じ。PHPはどちらかというとリモート接続イメージなので、レジストリやdll、その他のファイルについての問題は、ソースコード見てもなさそうです。問題は、1.5で新たにフィーチャーされた機能については新しいヘッダファイルをインクルードして構築したライブラリじゃなければ使用できそうにないことですが、、、逆に言えば、1.02までと同じRDBMS「として扱って」1.5を稼働させることはphpからのアクセスに関していえば特段問題が出る可能性も少なそうです。
結局のところPHPモジュールは位置づけとしてはisqlに近い存在だと思います。つまり、プロトコル経由で異なるソフトウェア同士が対話的に問題を解決するモデルですね。その場合には、今回のような問題には比較的強いことになりそうです。勿論、どのポートに問い合わせるか?などを解決するマッパー役のDLLなどのリソースに依存することは同じでしょうが…。
PHP から Firebird を使うにはどうすればよいのでしょうか。加藤大受さんの『Firebirdオープンソースデータベースの導入と運用の実際』に Apache をソースからコンパイルしたときの例が出ていますが、私は Red Hat Linux 7.3 に附属している rpm 版の Apache を使っています。ソースからコンパイルするとディレクトリ環境が変わってしまうこともあり、できれば rpm 版のままで使いたいと思います。ご教示いただければさいわいです。よろしくお願いします。
要約するとまずは…(一般的に配布されている)rpm版のままのApache&PHPでは無理です。というのも、ApacheのモジュールとしてInterBase関連関数を組み込むように
PHPのソースコードをconfigureしなければならないからです。一見ちょっと面倒なようですが、それほど難しいことはありません。
以下のPHPのドキュメント
http://jp.php.net/manual/ja/install.linux.php
http://jp.php.net/manual/ja/install.apache.php
http://jp.php.net/manual/ja/install.configure.php
などが参考になります。
ディレクトリ環境については、configureオプションでインストールするディレクトリをrpmにあわせるのも手です。
まぁ、redhatの自動アップデートからははずれてしまうでしょうが、configureのオプションを保管しておけば、更新の手間は大したものではないので、是非挑戦して下さい!私もよく分からない状態からやってみましたが、慣れると結構サクサクな作業ですよ。
ソースパッケージをインストールして、specファイルを編集し、rpmをビルドするという手もあります。
PHPではありませんが、Apacheで同様のことをしたときの様子をまとめたことがあります。古いので、rpmのバージョン3系列ですから、今のバージョン4とはちょっと違うかもしれません。(最近やってない)
http://homepage2.nifty.com/tomneko/tomneko_labo/tomneko_labo_5.html
Apacheの場合は、ログローテートの設定などもあり、rpmを再作成した方が便利だったので、やってみましたが、三浦さんの言うとおり、PHPをコンパイルするのも難しいことではないと思います。rpmにこだわるなら、こういうやり方もあるということで、参考にしてください。
三浦しゅう(5) 7
月7
日(月) 9
時9
分 - 2003年:
参考までに:
http://xdip.com/sylph/index.php?sylph_xsite=64
まずは稼動しているFirebird1.0.x、あるいはInterBase6.01の
動作を停止させなければなりません。(止めないとインストーラにしかられますTT)
/opt/interbase/bin/ibmgr -shut -password ????
赤い部分はFirebirdの前のバージョンがインストールされたフォルダ名です。
記憶によるとInterBaseにしろFirebirdにしろ、
前まではデフォルトで/opt/interbase/にインストールされていたと思っていました。
上述のコマンドで現在稼動しているエンジンを停止できます。
次は、手際の良い皆さんは用意してあるかと思いますが、
http://sourceforge.net/project/showfiles.php?group_id=9028
から最新のLinux版Firebirdを(この記事では1.5rc2をターゲットしています)
ダウンロードします。
(例: http://aleron.dl.sourceforge.net/sourceforge/firebird/FirebirdCS-1.5.0.3390-0.RC2.i686.tar.gz )そして、インストールしたいPCの適当なワークディレクトリにうつして、
tar xvfz FirebirdCS-1.5.0.3390-0.RC2.i686.tar.gz
でアーカイブを展開します。
その後、展開された内容が格納されたディレクトリに
cd FirebirdCS-1.5.0.3390-0.RC2.i686
で、移動して、その中のインストーラーを
./install.sh
とコマンド実行します。
あとは[Enter]キーを何度か押すと、
/usr/local/firebird に1.5rc2がインストールされます。
./configureの際のinterbaseオプションの
ディレクティブは「/opt/interbase」のままでもNPかと思いきや…
動いていた理由はむしろそこにあったようです。
念のためにfirebird1.02のリソースを/opt/interbaseに残していたので、
以前のリソースで動作していたと思われます。
で、とりあえずは特定できているポイントですが
firebirdインストールディレクトリ/include/の中に
以前のものも1.5rc2もcのヘッダファイルが配置されているのですが、
1.5rc2についてきているものではconfigureやmakeでエラーが起きます。
コードの詳細はまだみていないのですが、とりあえずご報告です。
※ちなみにかなり邪道ですが、
1.5rc2を稼働させて、古いincludeでphpを構築すれば
「とりあえず動いている」ことは確認済みです(苦
現状ではFirebird1.5そのものズバリのクライアントとしては
PHPは動作できしませんが、古いincludeを用いて
PHPモジュールを構築することで、Firebird1.5サーバーと
1.02クライアントの組み合わせのような状態で動作するようです。
三浦しゅう(5) 7
月7
日(月) 9
時11
分 - 2003年:
更に…
http://xdip.com/sylph/index.php?sylph_xsite=63
【重要】Linuxではクライアントライブラリの名称が変わっていることがチェンジログに載っていました。
(多分rc1の頃のことだと思います)
以下、公式変更ログより抜粋翻訳
* ファイル名変更.
我々はFirebirdなので配布ファイルの名称を変更します。現在、それら(のファイル)はfbserver, fbclient, firebird.msgなどです。
備考:
クライアントライブラリは現在fbclientです、そしてそれは新しいFB-basedプロジェクトで使用されます。gds32は何の機能も持っていませんが、リダイレクトを互換性のためだけにプロバイドします。.
※PHPではこのあたりの「互換性」がうまくいってないような気がする(訳注)
※もしかしてそれだけならFirebirdインストールディレクトリ中のinclude中のヘッダファイルの該当部分の書き換えだけで上手くいきそうな気が…。今のところ一番ポイントになりそうなのがibase.hかな…。どういう風にコールしているのかいまいち判らないので、1.5系と比べてみます。(しゅう)
Firebird1.5系のインストールに先立って、phpのibaseモジュールのソースコードを覗いてみました。
王道ではないのは承知の上ですが以下のような方策が便利そうです。
--with-interbase=/opt/interbase
※重要なのは1.02のincludeがどこにあるかです。
後日blob系の情報をソースから調査してみるつもりです。
元々blob系はドキュメント化されていないので、自分用のメモを掲載する程度ですがね。。。
【重要】Firebird1.5rc2のインストールによるリソースだけではPHPモジュールにibase関数群を組み込めません。原因は1.5系で改変されたfirebirdインストールディレクトリ/include/の中のヘッダファイル群です。PHPのibase関数群の構築にはFirebird1.02以前、或いはInterBaseのincludeヘッダファイル群が必要です。(追記:ヘッダファイルを覗いてみたところ、ヘッダファイルだけではなく、1.0.2以前のクライアントライブラリのバイナリも必要でしょう…)
【対策】Firebird1.5のインストールの前に、Firebird1.02をインストールして、そのリソースを残したまま1.5をインストールして、PHPの構築時にはFirebird1.02のインストールディレクトリを指定してあげましょう。そうすれば、サーバーとしてはFirebird1.5がフルスペックで動作し、クライアントとしてはInterBase互換のPHP関数群を使用できます。とりあえずこの方法で問題は起きていません。
※追記:Firebird1.5のリソースが悪いわけではなく、単に現行のPHPのibase関数群の取り込み方と一致しないだけです。