Ext JS に関しては,新しい記事は Sunvisor Lab. ExtJS 別館 にあります。そちらもよろしくお願いいたします。

CentOS:PHPからOracleを使えるようにする

現在作成中のアプリケーションは,イントラのサーバーに乗っけて,みんなに使ってもらうようになるので,その環境を構築しようと思い,CentOSのサーバーのPHPからOracleが使えるようにする設定をしました。そして,ハマりました。泣きました。できました。泣きました。で,そのときのメモです。

 Oracle クライアントのインストール

Oracleのクライアントは,Oracle Instant Client というのをインストールします。Oracleのサイト(Instant Client Downloads)から無料ダウンロードできます。(ダウンロードするにはユーザー登録が必要です)

参考サイト

サイトから,Instant Client をダウンロードします。参考サイトのアドバイスにより次の三つをダウンロード。

Instant Client Package - Basic
Instant Client Package - SQL*Plus
Instant Client Package - SDK

そしてインストール。

# rpm -ivh oracle-instantclient11.2-basic-11.2.0.2.0.i386.rpm
# rpm -ivh oracle-instantclient11.2-devel-11.2.0.2.0.i386.rpm
# rpm -ivh oracle-instantclient11.2-sqlplus-11.2.0.2.0.i386.rpm

環境変数の設定

export LD_LIBRARY_PATH=/usr/lib/oracle/11.2/client/lib/
export     ORACLE_HOME=/usr/lib/oracle/11.2/client/lib/

上記の内容のファイルを /etc/profile.d/oracle.sh に保存します。ついでに実行しておきます。

# source /etc/profile.d/oracle.sh

この環境変数が事前にセットされていないと,この後のoci8やpdo_ociのインストールに失敗します。

Oracleの実行テスト

sqlplusコマンドでデータベースにつないでみました。

# sqlplus tiger/scott@oracle.local:1521/hogedb

見事成功。SQLを流してみてもちゃんと実行されます。第1段階はコレで終了。

PHPにoci8とpdo_ociを入れる

PHPから使用できるようにするには,PHPの拡張モジュールをインストールしなければなりません。これからの手順は簡単ですが,実はこれを見つけるまで二日かかりました。(´・ω・`)

前準備

インストール済みのPHPに追加モジュールをインストールするにはpeclというコマンドを使います。これを使うためには,

# yum install php-pear
# yum install php-peardevel
# yum install php-devel

上記のようなパッケージをインストールしておく必要があります。(コメントで間違いを指摘されました。w) またコンパイルをするので開発ツールのインストールも必要です。作業中に不足するものが出てきたら,その都度インストールします。

まずはoci8のインストール

参考サイト

# pecl install oci8

途中で下記のように質問される。

Please provide the path to the ORACLE_HOME directory. 
Use 'instantclient,/path/to/instant/client/lib' 
if you're compiling with Oracle Instant Client [autodetect] :

これには次のように答える。

instantclient,/usr/lib/oracle/11.2/client/lib/

最初の "instantclient," を忘れてはいけないことに注意する。これがないとうまくインストールできないそうである。

インストールが完了したら,etc/php.d/oci8.ini を新規に作成し

extension=oci8.so

とかく。ファイルを作成したら、httpd をリスタートして完了。これでoci8関数が使えるようになる。こっちは割と簡単。

pdo_ociのインストール

pdo_ociの1.0では,Oracleの11gには対応していない。そこで,pdo_ociのソースをダウンロードしてちょこちょこ触ってからインストールする必要があります。

参考サイト

peclでソースをダウンロードして,展開する。カレントディレクトリを展開されたところにします。

pecl download pdo_oci
tar xzf PDO_OCI-1.0.tgz
cd PDO_OCI-1.0

config.m4にパッチを当てるために,パッチファイルを用意します。以下のファイルをoci_patch.txtとして,保存する。

### Eclipse Workspace Patch 1.0
#P pdo_oci
Index: config.m4
===================================================================
--- config.m4	(revision 141)
+++ config.m4	(working copy)
@@ -7,6 +7,8 @@
   if test -s "$PDO_OCI_DIR/orainst/unix.rgs"; then
     PDO_OCI_VERSION=`grep '"ocommon"' $PDO_OCI_DIR/orainst/unix.rgs | sed 's/[ ][ ]*/:/g' | cut -d: -f 6 | cut -c 2-4`
     test -z "$PDO_OCI_VERSION" && PDO_OCI_VERSION=7.3
+  elif test -f $PDO_OCI_DIR/lib/libclntsh.$SHLIB_SUFFIX_NAME.11.2; then
+    PDO_OCI_VERSION=11.2    
   elif test -f $PDO_OCI_DIR/lib/libclntsh.$SHLIB_SUFFIX_NAME.10.1; then
     PDO_OCI_VERSION=10.1    
   elif test -f $PDO_OCI_DIR/lib/libclntsh.$SHLIB_SUFFIX_NAME.9.0; then
@@ -57,14 +59,19 @@
     AC_MSG_CHECKING([for oci.h])
     if test -f $PDO_OCI_IC_PREFIX/include/oracle/$PDO_OCI_IC_VERS/client/oci.h ; then
       PHP_ADD_INCLUDE($PDO_OCI_IC_PREFIX/include/oracle/$PDO_OCI_IC_VERS/client)
+      PDO_OCI_LIB_DIR="$PDO_OCI_IC_PREFIX/lib/oracle/$PDO_OCI_IC_VERS/client/lib"
       AC_MSG_RESULT($PDO_OCI_IC_PREFIX/include/oracle/$PDO_OCI_IC_VERS/client)
     elif test -f $PDO_OCI_IC_PREFIX/lib/oracle/$PDO_OCI_IC_VERS/client/include/oci.h ; then
       PHP_ADD_INCLUDE($PDO_OCI_IC_PREFIX/lib/oracle/$PDO_OCI_IC_VERS/client/include)
+      PDO_OCI_LIB_DIR="$PDO_OCI_IC_PREFIX/lib/oracle/$PDO_OCI_IC_VERS/client/lib"
       AC_MSG_RESULT($PDO_OCI_IC_PREFIX/lib/oracle/$PDO_OCI_IC_VERS/client/include)
+    elif test -f $PDO_OCI_IC_PREFIX/sdk/include/oci.h ; then
+      PHP_ADD_INCLUDE($PDO_OCI_IC_PREFIX/sdk/include)
+      AC_MSG_RESULT($PDO_OCI_IC_PREFIX/sdk/include)
+      PDO_OCI_LIB_DIR="$PDO_OCI_IC_PREFIX"
     else
       AC_MSG_ERROR([I'm too dumb to figure out where the include dir is in your instant client install])
     fi
-    PDO_OCI_LIB_DIR="$PDO_OCI_IC_PREFIX/lib/oracle/$PDO_OCI_IC_VERS/client/lib"
     PDO_OCI_VERSION="`echo $PDO_OCI_IC_VERS | cut -d. -f1-2`"
   else
     if test -d "$PDO_OCI_DIR/rdbms/public"; then
@@ -119,6 +126,9 @@
     10.2)
       PHP_ADD_LIBRARY(clntsh, 1, PDO_OCI_SHARED_LIBADD)
       ;;
+    11.2)
+      dnl PHP_ADD_LIBRARY(clntsh, 1, PDO_OCI_SHARED_LIBADD)
+      ;;
     *)
       AC_MSG_ERROR(Unsupported Oracle version! $PDO_OCI_VERSION)
       ;;
@@ -176,22 +186,24 @@
     -L$PDO_OCI_LIB_DIR $PDO_OCI_SHARED_LIBADD
   ])
 
-  ifdef([PHP_CHECK_PDO_INCLUDES],
-  [
-    PHP_CHECK_PDO_INCLUDES
-  ],[
-    AC_MSG_CHECKING([for PDO includes])
-    if test -f $abs_srcdir/include/php/ext/pdo/php_pdo_driver.h; then
+dnl  ifdef([PHP_CHECK_PDO_INCLUDES],
+dnl  [
+dnl    PHP_CHECK_PDO_INCLUDES
+dnl ],[
+    AC_MSG_CHECKING([ PDO includes])
+    if test -f $prefix/include/php/ext/pdo/php_pdo_driver.h; then
+      pdo_inc_path=$prefix/include/php/ext
+    elif test -f $prefix/include/php5/ext/pdo/php_pdo_driver.h; then
+      pdo_inc_path=$prefix/include/php5/ext
+    elif test -f $abs_srcdir/include/php/ext/pdo/php_pdo_driver.h; then
       pdo_inc_path=$abs_srcdir/ext
     elif test -f $abs_srcdir/ext/pdo/php_pdo_driver.h; then
       pdo_inc_path=$abs_srcdir/ext
-    elif test -f $prefix/include/php/ext/pdo/php_pdo_driver.h; then
-      pdo_inc_path=$prefix/include/php/ext
     else
       AC_MSG_ERROR([Cannot find php_pdo_driver.h.])
     fi
     AC_MSG_RESULT($pdo_inc_path)
-  ])
+dnl  ])
 
   PHP_NEW_EXTENSION(pdo_oci, pdo_oci.c oci_driver.c oci_statement.c, $ext_shared,,-I$pdo_inc_path)

パッチを当てます。

patch -p0 < oci_patch.txt

これで,config.m4が修正されました。後は次の手順で,インストールします。

phpize
./configure  --with-pdo-oci=instantclient,/usr,11.2
make
make install

oci8のときと同じように, /etc/php.dにpdo_oci.iniファイルを作り,内容を次のようにします。

extension=pdo_oci.so

ここで,Apacheをリスタートします。

# service httpd restart

途中,いろいろハマったので,ここで[OK]が二つ並んだときはどんなうれしかったか!

トラックバック


URL から "-MoIyadayo" を削除してトラックバックを送信してください。
トラックバックは承認後に表示されます。

typo

 pearインストールのところ、

# yum install php-peardevel

じゃなくて

# yum install php-devel

ですね。

お!そうでしたか? 編集ミスですね。きっと。w ご指摘あり

お!そうでしたか? 編集ミスですね。きっと。w ご指摘ありがとうございます。

ありがとうございます

>pdo_ociの1.0では,Oracleの11gには対応していない

てことに気づかず、ずっとハマってましたが、ココをみて解決しました。ありがとうございます。

お役に立ててなによりです

 これ,僕も結構ハマったんです。最近はハマったときは「ブログネタができた」と思うことにしています。w