Do You PHP?    
Search Engine Optimization  php5 powerd  Valid XHTML 1.0!  Valid CSS!  このサイトのはてなブックマーク数 



last updated
2006/04/21

counter hits
since 1999/11/06


PHP+Oracle Instant Clientのインストール

先日何気なくPHPマニュアルのOCI8ページを見ていると、何やら見慣れない「--with-oci8-instant-client」の文字が。。。よく見てみると、「Oracle Instant Clientを使用している場合は--with-oci8-instant-clientオプションを使いましょう」だと。うーん。。。Oracle10gがリリースされてしばらく経ちますが、いつの間にか無償でOracle Instant Clientなるものを配布していたようです。Oracleも変わりましたね。。。また、PHP4.3.11/5.0.4から正式にサポートされるようです。

memoPHP5.0.4-devでも同様に動作確認ができました。configureオプションは同じです。

cautionPHP5.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

cautionconfigureに失敗した場合、コンソールの最後にメッセージが表示されるので、確認してみましょう。また、ログファイルconfig.logが作成されているはずですので、こちらも確認してみましょう。このファイルには、configureスクリプトの何行目辺りにある、どういった処理を行っている時にエラーとなったかが記されています。

5.コンパイルとインストール

configureが無事終了したら、makeを実行しコンパイルを行います。コンパイルが終了したらrootユーザーとなり、インストールを実行します。

$ make
$ su
# make install

memoインストール先は、[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

alertOracleとの連携を行う場合、 「mbstring.internal_encodingの文字コード = NLS_LANGの文字コード」 と指定することで、PHPスクリプトとDBから取得した文字での文字化けを防ぐことができます。mbstring.internal_encodingとPHPスクリプトの文字コードが異なる場合、mbstring.script_encodingを使用する必要があります。

これを/usr/sbin/apachectlとして保存しておき、実行権限を与えておきます。

# chmod u+x /usr/sbin/apachectl

caution環境変数を変更した場合は、一度停止させて起動する必要があります(restartオプションではダメです)

9.Apacheの起動と動作確認

スクリプトを使ってApacheを起動します。

$ su -
# /usr/sbin/apachectl start

以下のようなPHPスクリプトを用意し、Oracleとの接続テストを行います。


<?php
<b>●Oracleとの接続テスト</b>
<hr>
<?php
    // Oracleとの接続
    $conn = OCILogon("scott", "tiger", "dbserver:1521/orcl");

    // SQL文のparse
    $stmt = OCIParse($conn,"select * from emp ");

    // SQL文の実行
    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>";

    // データのFetch
    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);

    // Oracleから切断
    OCILogoff($conn);
?>

ブラウザからアクセスしてみて、以下のようにテーブルの内容が表示されればOKです。

Apacheの起動確認


About This Site |  Privacy Policy |  Contact
Copyright © 1999 - 2006 by Hideyuki SHIMOOKA all rights reserved.