somemo programming etc.

プログラマ、雑記、プログラミング関係はLinkから、数式はこっちでまとめていることが多い

【php】Oracleとの接続(リモート)【Linux】

Linux(CentOS5.4)からリモートのWindowsのOracleXEに instant clientを用いて接続するように設定します。 [準備]  下記URLから、RPMをダウンロードします。   oracle-instantclient11.2-devel-11.2.0.1.0-1.i386.rpm    URL:http://www.oracle.com/technetwork/jp/topics/linuxsoft-083388-ja.html  ダウンロードしたファイルをLinuxにアップロードしておきます。  develファイル(OCI関数を使用するため)は、  basicファイルに依存していますので、インストールしていなければ  上記URLからダウンロードし、basicファイルからインストールします。  rpm -ivh oracle-instantclient11.2-basic-11.2.0.1.0-1.i386.rpm  rpm -ivh oracle-instantclient11.2-devel-11.2.0.1.0-1.i386.rpm [OCI8インストール]  oci8ライブラリ(モジュール)を取得するために、下記コマンドを実行します。   pecl install oci8   [コマンド実行後]   downloading oci8-1.4.5.tgz ...   Starting to download oci8-1.4.5.tgz (154,284 bytes)   .............done: 154,284 bytes   10 source files, building   running: phpize   Configuring for:   PHP Api Version: 20090626   Zend Module Api No: 20090626   Zend Extension Api No: 220090626   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] :  ここで、「ORACLE_HOMEのパス」「instantclientのパス」を入力するように言われます。  今回はinstantclientを使用するのでそちらを入力します。   instantclient,/usr/lib/oracle/11.2/client/lib/  入力後、下記メッセージが表示されました。  ソースからコンパイルしているときと同じ動作をしているようです。   building in /var/tmp/pear-build-rootkuZiyv/oci8-1.4.5   running: /var/tmp/oci8/configure --with-oci8=instantclient,/usr/lib/oracle/11.2/client/lib/  最後に、下記メッセージが表示されました。   Build process completed successfully   Installing '/usr/lib/php/modules/oci8.so'   install ok: channel://pecl.php.net/oci8-1.4.5   configuration option "php_ini" is not set to php.ini location   You should add "extension=oci8.so" to php.ini   channelというワードから、pearと同じかなと思ったので   「pecl」「pear」を実行したら同じでした。   調べたら違いがあったので、下記のリンクを参照してください。    PECL:提供されるライブラリはC記述、php.iniが修正されない    PEAR:提供されるライブラリはPHP記述、そのためPECLより遅いらしい、php.iniの修正必要なし [php.ini修正]  OCI8インストール時に  「oci8.soを拡張モジュールとして使うようにphp.iniを修正してください」  というメッセージが表示されたので、修正します。  まずは、拡張モジュールのベースとなるディレクトリを設定します。  今回、「/usr/lib/php/modules/」されたので、ここにします。   ; extension_dir = "./"  ⇒extension_dir = /usr/lib/php/modules/  次に Dynamic Extensions の付近に下記を追加します。   extension=oci8.so    apacheを再起動し、phpinfoに「oci8」が表示されればOKです。 [pdo_ociインストール]  pdo_ociライブラリ(モジュール)を取得するために、下記コマンドを実行します。   pecl install pdo_oci   実行結果:    pear/PDO_OCI requires PHP extension "pdo" (version >= 1.0)    No valid packages found    install failed   pdoのバージョンが1.0以上でないといけないそうです。   peclでpdoをインストールした記憶が無いので、下記コマンドで確認します。    pecl list    もちろんありませんでした。   yumでインストールしたpdoのバージョン確認をします。    php --re pdo    ※--re Show information about extension .    実行結果:     Extension [ extension #36 PDO version 1.0.4dev ] {   よくわからなくなったので、pdoをpeclでインストールしてみる。    pecl install pdo            実行結果:     /var/tmp/PDO/pdo_dbh.c:1122: warning: assignment discards qualifiers from pointer target type     /var/tmp/PDO/pdo_dbh.c:1126: warning: assignment discards qualifiers from pointer target type     make: *** [pdo_dbh.lo] エラー 1     ERROR: `make' failed     調べてみたものの、解決策が全然見つからないので別の方法を見つけることにしました。  *******************************************  直接インストールするのではなく、ソースをダウンロードしてからインストールすることにしました。    下記コマンドでソースをダウンロードします。   pecl download pdo_oci    または、   wget http://pecl.php.net/get/PDO_OCI-1.0.tgz  ダウンロードできたPDO_OCI-1.0.tgzを展開し、そのディレクトリに移動します。   tar zxfv PDO_OCI-1.0.tgz   cd PDO_OCI-1.0  phpizeというコマンドを実行し、拡張モジュールをビルドする。  phpizeの簡単な説明:http://www.phppro.jp/word/phpize   phpize  ここからは、ソースからインストールする手順と同じです。  まず、configureスクリプトを実行し、設定を決めます。   ./configure --with-pdo-oci=instantclient,/usr,11.2   (instant clientの場合、インストールした場所(の一部?)とバージョンを指定します。)   実行結果:    checking for oci.h... /usr/include/oracle/11.2/client    configure: error: Unsupported Oracle version! 11.2    11.2はサポートされてないようです・・・   色々調べてみると、config.m4というスクリプトが10.1までしか対応していないようです。   このスクリプトにパッチをあてて修正するとconfigureスクリプトが正しく動作します。   パッチ参考サイト:    パッチの元:http://www.sunvisor.net/node/406    パッチの元の元(11.1対応パッチ):http://bugs.php.net/bug.php?id=39312   上記パッチをoci_patch.txtとして保存し、下記コマンドを実行します。    patch -p0 < oci_patch.txt    実行結果:     (Stripping trailing CRs from patch.)     patching file config.m4     Hunk #1 FAILED at 7.     Hunk #2 FAILED at 59.     Hunk #3 FAILED at 126.     Hunk #4 FAILED at 186.     4 out of 4 hunks FAILED -- saving rejects to file config.m4.rej   パッチの必要なものだけを抽出して、config.m4を直接編集します。    elif test -f $PDO_OCI_DIR/lib/libclntsh.$SHLIB_SUFFIX_NAME.11.2; thenPDO_OCI_VERSION=11.2    11.2) PHP_ADD_LIBRARY(clntsh, 1, PDO_OCI_SHARED_LIBADD) ;;    参考サイト(Patch部分):     http://www.edmann.com/Computers-Technology/2009/10/08/Oracle-PDO-OCI-PHP-install-fedora-CentOS   改めてconfigureスクリプトの実行~make install    ./configure --with-pdo-oci=instantclient,/usr,11.2    make    make install   make install後に   「Installing shared extensions: /usr/lib/php/modules/」   と表示されたので、確認してみると「pdo_oci.so」が作成されていました。   これを拡張モジュールとして設定します。    ファル名:vim /etc/php.d/pdo_oci.ini    内容:extension=pdo_oci.so    通常、php.iniに記載しますが、    各モジュールごとの設定ファイルをphp.dディレクトリ以下に作成することもできるようです。   apacheを再起動し、【php】Oracle(ローカル)との接続【windows】にて作成したphpコードを用いて、接続の確認をします。   無事に、同じ内容が表示されました。   また、phpinfo()に下記内容が追加されていました。    PDO:PDO drivers(oci)    PDO_OCI:内容は空 だいぶ時間がかかりました・・・ 以上。