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]が二つ並んだときはどんなうれしかったか!

typo
pearインストールのところ、
# yum install php-peardevel
じゃなくて
# yum install php-devel
ですね。
お!そうでしたか? 編集ミスですね。きっと。w ご指摘あり
お!そうでしたか? 編集ミスですね。きっと。w ご指摘ありがとうございます。
ありがとうございます
>pdo_ociの1.0では,Oracleの11gには対応していない
てことに気づかず、ずっとハマってましたが、ココをみて解決しました。ありがとうございます。
お役に立ててなによりです
これ,僕も結構ハマったんです。最近はハマったときは「ブログネタができた」と思うことにしています。w