|
先日何気なくPHPマニュアルのOCI8ページを見ていると、何やら見慣れない「--with-oci8-instant-client」の文字が。。。よく見てみると、「Oracle Instant Clientを使用している場合は--with-oci8-instant-clientオプションを使いましょう」だと。うーん。。。Oracle10gがリリースされてしばらく経ちますが、いつの間にか無償でOracle Instant Clientなるものを配布していたようです。Oracleも変わりましたね。。。また、PHP4.3.11/5.0.4から正式にサポートされるようです。
PHP5.0.4-devでも同様に動作確認ができました。configureオプションは同じです。
PHP5.1.2から「--with-oci8=instantclient」に変更されていますので注意が必要です。
ということで、通常のOracle Clientの場合との違いを中心にOracle Instant Clientを使ってOCI関数をサポートしたPHP4.3.xをApache DSO(Dynamic Shared Object)としてのインストール手順を示します。
1.Apacheのインストール
Apache1.3系やApache2.0系のインストールのページを参照して、DSOをサポートするようインストールしてください。今回は、Apache2.0.52を使用しました。
2.Oracle Instant Clientのインストール
冒頭にもありますが、Oracle Instant Clientは米OTNで無償配布されています。今回は「Linux x86 32-bit」を選択し、以下の4ファイルをダウンロード・インストールしました。
- Instant Client Package - Basic
- Instant Client Package - JDBC Supplemen
- Instant Client Package - SQL*Plus
- Instant Client Package - SDK
実際にPHPのbuildに必要なのは、Basic・SDKです。
インストール後、SQL*Plusで接続確認を行ってみましょう。接続識別子はInstant ClientのFAQにあるように
host:[port][/service name]
となりますので、以下のコマンドで接続確認を行います。
$ LD_LIBRARY_PATH=/usr/lib/oracle/10.1.0.3/client/lib sqlplus scott/tiger@dbserver:1521/orcl
SQL*Plus: Release 10.1.0.3.0 - Production on Sat Feb 12 01:54:01 2005
Copyright (c) 1982, 2004, Oracle. All rights reserved.
Connected to:
Oracle9i Release 9.2.0.5.0 - Production
JServer Release 9.2.0.5.0 - Production
SQL> exit;
Disconnected from Oracle9i Release 9.2.0.5.0 - Production
JServer Release 9.2.0.5.0 - Production
$
Oracle Netがなくても繋がるのは、正直ちょっと違和感が。。。(^-^;
3.PHPのソースを入手・展開
今回はPHP本家のsnapsサイト(http://snaps.php.net/)からphp4.3.11-devのスナップショットを取得しました。ダウンロードしたのはphp4-STABLE-200502111330.tar.bz2です。展開後、php4-STABLE-200502111330ディレクトリに移動します。GNU tarの場合、以下のコマンドです。
$ tar jxf php4-STABLE-200502111330.tar.bz2
$ cd php4-STABLE-200502111330/
4.PHPのconfigure
ここでOCI関数サポートのオプションを付け、configureスクリプトを実行します。ただし、「--with-oci8」ではなく冒頭にもある「--with-oci8-instant-client」になります。また、値としてOracle Instant Clientのライブラリパスを指定します。なお、今回はsharedモジュールとしてのbuildを行いました。その他のオプションはお好みでどうぞ。
$ ./configure \
--prefix=/usr/local/lib/php4 \
--with-apxs2=/usr/local/apache2/bin/apxs \
--with-config-file-path=/usr/local/lib/php4/ini/4.3 \
--with-config-file-scan-dir=/usr/local/lib/php4/php.d \
--with-pear=/usr/local/lib/php4/pear \
--enable-zend-multibyte \
--enable-mbstring \
--enable-mbregex \
--without-mysql \
--enable-xslt \
--with-xslt-sablot=/usr \
--with-dom \
--with-zlib-dir \
--with-expat-dir=/usr \
--with-zlib=shared \
--with-gd=shared \
--with-png-dir \
--with-jpeg-dir \
--with-ttf \
--with-ldap=shared \
--with-oci8-instant-client=shared,/usr/lib/oracle/10.1.0.3/client/lib \
--without-mysql \
--enable-sigchild
configureに失敗した場合、コンソールの最後にメッセージが表示されるので、確認してみましょう。また、ログファイルconfig.logが作成されているはずですので、こちらも確認してみましょう。このファイルには、configureスクリプトの何行目辺りにある、どういった処理を行っている時にエラーとなったかが記されています。
5.コンパイルとインストール
configureが無事終了したら、makeを実行しコンパイルを行います。コンパイルが終了したらrootユーザーとなり、インストールを実行します。
$ make
$ su
# make install
インストール先は、[Apacheのインストール先]/libexec となります。ここにlibphp4.soが存在するかどうか、確認しましょう(これが実体です)。
6.php.iniの設定
PHP4の設定ファイルであるphp.iniのコピー&設定を行います。php4-STABLE-200502111330RC4ディレクトリにphp.ini-recommendedファイルがありますので、/usr/local/lib/php4/ini/4.3/php.iniとしてコピー&編集します。今回はsharedモジュールとしてインストールしましたので、extension_dirとextensionの各ディレクティブを追加編集しておきます。
extension_dir = "/usr/local/lib/php4/lib/php/extensions/no-debug-non-zts-20020429/"
extension=oci8.so
その他基本的な編集内容はPHP4.3.0のインストール手順を参照してください。
7.httpd.confの設定
[Apacheのインストール先]/conf/httpd.confを編集し、PHPを使用可能な状態にします。以下の赤字が編集した部分です。
DirectoryIndex index.html index.php(必要であれば)
AddType application/x-httpd-php .php(アンコメント。必須)
AddType application/x-httpd-php-source .phps(必要であればアンコメント)
8.Apache起動・停止用スクリプトを作成する
Oracle Clientの場合の起動停止用スクリプトとはちょっと異なります。Oracle Instant Clientの場合、環境変数「LD_LIBRARY_PATH」「NLS_LANG」のみ必要となります。また、LD_LIBRARY_PATHに指定するのは「--with-oci8-instant-client」に指定したパスになります。ということで、以下のようなスクリプトを作成します。
#!/bin/sh
export NLS_LANG=Japanese_Japan.JA16EUC
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/oracle/10.1.0.3/client/lib
/usr/local/apache/bin/apachectl $1
Oracleとの連携を行う場合、
「mbstring.internal_encodingの文字コード = NLS_LANGの文字コード」
と指定することで、PHPスクリプトとDBから取得した文字での文字化けを防ぐことができます。mbstring.internal_encodingとPHPスクリプトの文字コードが異なる場合、mbstring.script_encodingを使用する必要があります。
これを/usr/sbin/apachectlとして保存しておき、実行権限を与えておきます。
# chmod u+x /usr/sbin/apachectl
環境変数を変更した場合は、一度停止させて起動する必要があります(restartオプションではダメです)
9.Apacheの起動と動作確認
スクリプトを使ってApacheを起動します。
$ su -
# /usr/sbin/apachectl start
以下のようなPHPスクリプトを用意し、Oracleとの接続テストを行います。
<?php
<b>●Oracleとの接続テスト</b>
<hr>
<?php
$conn = OCILogon("scott", "tiger", "dbserver:1521/orcl");
$stmt = OCIParse($conn,"select * from emp ");
OCIExecute($stmt);
$ncols = OCINumCols($stmt);
echo "<TABLE BORDER='1'>";
echo "<TR>";
for ( $i = 1; $i <= $ncols; $i++ ) {
$column_name = OCIColumnName($stmt,$i);
echo "<TH>" . $column_name . "</TH>";
}
echo "</TR>";
while(OCIFetch($stmt))
{
echo "<TR>";
for ( $i = 1; $i <= $ncols; $i++ ) {
$column_name = OCIColumnName($stmt,$i);
echo "<TD>" . OCIResult($stmt, $column_name) . "</TD>";
}
echo "</TR>";
}
echo "</TABLE>";
OCIFreeStatement($stmt);
OCILogoff($conn);
?>
ブラウザからアクセスしてみて、以下のようにテーブルの内容が表示されればOKです。
|