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