前回、PostgreSQLにPHP3+Apacheを利用して接続してみました。筆者の環境はLaser5Linux6.0Rel2で、ディストリビューションに含まれる環境は、PostgreSQL-6.5.2、Apache-1.3.9-8で、PHP3は含まれていません。PostgreSQLはRPMでインストールしてしまっていたので、これを削除してPostgreSQL-7.0.2に入れ替えました(第3回)。
今回は、順番が逆になりましたが、前回のサンプルを動かすための環境作りについて書いていきたいと思います。
PHP3にはPHP日本公式ページにて公開されている国際化バージョンPHP-3.0.15-i18n-jaを利用することにします。英語版の最新バージョンは3.0.18ですが、日本語がうまくとおらないと使う意味がありませんね。3.0.18用のパッチも出てきたみたいですし、近いうちにPHP4に移行する予定なのでこれでいきましょう。(国際化プロジェクトの皆さんご苦労様です。)
さて、この国際化バージョンをインストールするにあたっては、国際化機能を有効にするオプションをつけてコンパイルしなくてはなりません。具体的に以下のとおりです。
# ./configure --with-pgsql --with-interbase=/opt/interbase --enable-i18n --enable-mbregex
i18nオプションで国際化機能を有効にして、mbregexオプションでマルチバイト対応の正規表現機能を有効にします。ところが、このままだと続くmakeでエラーが出てしまいます。
gcc -g -O2 -O2 -m486 -fno-strength-reduce -DLINUX=2 -DUSE_EXPAT -I../lib/expat-lite -O2 -fpic -DSHARED_MODULE -I. -I. -I/usr/include/apache -I/opt/interbase/include -I/usr/local/pgsql/include -c i18n.c -o i18n.o In file included from i18n.c:42: mbregex.h:47: warning: `RE_CHAR_CLASSES' redefined /usr/include/regex.h:67: warning: this is the location of the previous definition In file included from i18n.c:42: mbregex.h:94: redefinition of `struct re_pattern_buffer' mbregex.h:141: redefinition of `struct re_registers' make: *** [i18n.o] Error 1
PHPのtarボールを展開したディレクトリにあるREADME.i18nを読むと以下のような記述があります。
■ PHPをソースからインストールする際、makeにRE_CHAR_CLASSエラー システムの正規表現がapacheに組み込まれており、これが日本語対応の正規表現とぶつかってます。お手数ですが、apacheをconfigureから作り直し、--disable-rule=WANTHSREGEXを使わない様にしてください。どうやらapacheを再コンパイルしないといけないようです。とはいえ、システムのapacheはRPMでインストールされていますし、RPMでインストールするとログのローテーションなど有用な機能なども追加されるので、apacheまでtarボールからインストールするのは何とか避けたいものです。(そこまでするならPlamoLinuxでも使った方が良い:-p
そこで、apacheのソースパッケージ(src.rpm)のSPECファイルを書き換えて上記のエラー対策をとることにしました。CD-ROMやインターネットから該当するapache-1.3.9-8.src.rpmをrpmのビルドディレクトリに展開します。
#rpm -i apache-1.3.9-8.src.rpm
/usr/src/redhat/SPECS に移動して apache.spec を修正します。
%build
OPTIM="$RPM_OPT_FLAGS" \
./configure --prefix=/usr \
--with-layout=RedHat \
--add-module=%{SOURCE8} \
--add-module=%{SOURCE9} \
--enable-module=all \
--enable-shared=max \
--disable-rule=WANTHSREGEX \
--disable-module=auth_dbm \
--with-perl=/usr/bin/perl \
--enable-suexec \
--suexec-docroot=/home/httpd/html \
--suexec-caller=nobody
make
63行目から始まる%buildセクションで、 --disable-rule=WANTSREGEX \ の行を削除します。変更を保存してから、パッケージの再構築を行います。
#rpm -ba apache.spec
こうして出来たRPMパッケージをこれまでのものと入れ替えます。
#rpm -e apache #rpm -e apache-devel
manualパッケージは関係ないので、そのままでいいでしょう。
#rpm -Uvh apache-1.3.9-8.i386.rpm #rpm -Uvh apache-devel-1.3.9-8.rpm
もう一度、phpのmakeをやり直すとエラーは出なくなっています。installしてみます。
[root@pote-svr php-3.0.15-i18n-ja]# make install /usr/sbin/apxs -i -a -n php3 libphp3.so cp libphp3.so /usr/lib/apache/libphp3.so chmod 755 /usr/lib/apache/libphp3.so [activating module `php3' in /etc/httpd/conf/httpd.conf]
大丈夫ですね。では、httpd.confに修正を加えたらhttpdを再起動してみます。変更する所は、DSOサポートの所で2ヶ所、それとDirectoryIndexにphp3を追加します。また、mimeタイプの追加をします。全て先頭のコメントアウトの#を取るだけでOKです。
LoadModule php3_module modules/libphp3.so AddModule mod_php3.c DirectoryIndex index.html index.htm index.shtml index.cgi index.php3 AddType application/x-httpd-php3 .php3 AddType application/x-httpd-php3-source .phps
さて、Windows版のインストールはsetup.exeを起動して、おなじみのインストーラーの指示に従っていけばよいので簡単です。私の環境ではServiceとして実行するとエラーが出るので、InterBase Server ManagerからServiceとして実行のチェックボックスをオフにしておきました。Startup ModeをAutoにしておけば次回OS起動時に自動的にInterBaseサーバーが起動するようになります。
サーバーの管理は同じメニュー内にあるIBConsoleから行います。Local Serverの他にIB on Linuxというサーバーが登録されているのは、ネットワーク上のLinuxマシン上で起動しているInterBaseへのAliasです。初回起動時はLocal Serverしか登録されていないので、ServerメニューのRegisterから別のマシン上のInterBaseを登録することが出来ます。
データベースを作成するためにはサーバーにlogonする必要があります。ServerメニューのLogonを実行するとUserNameとPsswordをきいてくるので、初期管理者であるSYSDBA/masterkeyでログオンします。Install.txtではまずSYSDBAのパスワードを変更するようにと指示されているので、ServerメニューのUserSecurityから適宜変更しておきます。
サーバーにログオンしたら、DatabaseメニューからCreate Databaseを実行して、yubinデータベースを作成します。Aliasにyubin、Filename(s)にc:\database\yubin.gdbなどと入力して、OKします。Filename(s)となっていることからもわかりますが、InterBaseではひとつのデータベースを複数のファイルに分割して作成することがかのうです。この機能によって、OSのファイルサイズの制限を越えた巨大なデータベースを作成することが出来るわけです。いったん作成してしまったデータベースもバックアップ・リストアの操作によって複数ファイルに復元するということが出来るので、安心ですね。(^^;
さて、データの追加ですが、例によってODBCでAccessからエクスポートしてしまおうと思うわけですが、InterBase6用のODBCドライバはまだ出揃っていないようです。Borlandでは、「ver.5.6の評価版に入っているからそれを使え」といっているので、それもダウンロードしてきてODBCドライバだけインストールしておきます。InterBase_WI-V56.zipをInterBaseのサイトからダウンロードして、解凍・インストールします。インストールのオプションで、ODBCドライバだけを選択してインストールしておきます。ver.5.6のサーバーやクライアントはインストールしないように注意しなければいけません。
ODBCアドミニストレーターを起動して、データソースを作成します。追加ボタンをクリックして、INTERSOLV Interbase ODBC Driver (*.gdb)を選択してDataSourceNameにIB_Yubin、DatabaseNameにc:\database\yubin.gdbと入力してOKします。他のコンピューター上で実行されているInterBaseへの接続の場合は、DatabaseNameをコンピューター名:データベースのフルパス名というように指定します。コンピューター名はIPアドレスでも構いません。このへんちょっとわかりにくいですね。
[4]でPostgreSQLにデータを挿入した時と同様に、ODBCデータソースIB_YubinからT_YUBINへのリンクテーブルを作成して、insert into t_yubin_ib select * from t_yubin; を実行してデータを挿入してしまいます。Accessを終了して、IBConsoleからDatabase yubinにConnectして、TablesのT_Yubinをダブルクリックしてみます。Dataタブを開くと、ちゃんとデータが入っているかどうか確認できます。
Linux版もrpm -Uvh InterBaseSS_LI-V6.0-1.i386.rpm とすればインストールできます。Laser5Linux6.0rel2と昨日入れ替えたVineLinux2.1CRの両方で正常にインストールできました。CS版のほうはインストールしてしまえばそれでOKのようなのですが、SS版のほうは手動でサーバーを起動してあげないといけません。/opt/interbase/binにあるibmgrを-startオプションを付けて実行します。
[/opt/interbase/bin]#./ibmgr -start
対話型sqlツールのisqlを実行してみます。サンプルのデータベースであるemployee.gdbに接続してみましょう。employee.gdbは/opt/interbase/examplesにあります。
# isql
Use CONNECT or CREATE DATABASE to specify a database
SQL> connect /opt/interbase/examples/employee.gdb;
Database: /opt/interbase/examples/employee.gdb
SQL> show tables;
COUNTRY CUSTOMER
DEPARTMENT EMPLOYEE
EMPLOYEE_PROJECT JOB
PHONE_LIST PROJECT
PROJ_DEPT_BUDGET SALARY_HISTORY
SALES
SQL> quit;
さて、毎回ibmgrを起動するのは面倒なので、rc.localにコマンドラインを追加しておきましょう。
if [ -x /opt/interbase/bin/ibmgr ];then /opt/interbase/bin/ibmgr -start fi
また、isqlを起動するのに必要なので、/opt/interbase/binへのPATHを追加するか、/usr/local/binあたりにシンボリックリンクを作成しておきます。筆者は/etc/profileを以下のようにしてしまいました。
# /etc/profile # System wide environment and startup programs # Functions and aliases go in /etc/bashrc PATH="$PATH:/usr/X11R6/bin:/usr/vine/bin:/opt/interbase/bin" −以下省略−
こちらにもYubinデータベースを作成しておこうと思いますが、Windows版のyubin.gdbをsambaを使ってLinux側にコピーするだけで使用する事が出来ます。/usr/local/database/yubin.gdbにファイルをコピーして、Windows側のIBConsoleからServer-Registerメニューを実行して、ServerNameにLinuxマシンのIPアドレスを、NetworkProtcolをTCP/IPにして、AliasNameをIB on Linuxとかにします。そのサーバーにログオンして、Database-RegisterメニューでFileにフルパスを、AliasNameにyubinとしてOKします。DatabaseにConnectして、TablesのT_YUBINを見てみてください。ちゃんとデータが読めますね。
ということで、Windows版、Linux版それぞれのInterBase6が使用出来るようになりました。次は、InterBaseを使ったPHPのアクセス方法ということで…。