(2014.10.29) PHP から Oracle を使う際に PDO_OCI を使いたかったのですが、 RPM パッケージを提供してくれるところを見つけられなかったので 自前構築した時のメモです。なお CentOS 6.3 の時代に評価した結果はこちらです(すでに現状と合わなくなっている可能性があります)。
(2015.07.22) oci8 のインストールが抜けていたので追加。
例示におけるプラットフォームには CentOS 7.0(64bit) を使っています。他の OS やディストリビューションをお使いの方は、yumなど固有のコマンド名を適宜読み替えてください。
PDO(PHP Data Objects)は PHP 5.1 から標準でバンドルされている、各種データベースへのアクセスを抽象化するインターフェースです。これを使うと複数の RDBMS に対して同じ方法でアクセスできます。これを使う場合は php-pdo というパッケージをインストールします。
PDO を使うにしろ使わないにしろ、データベースを使う限りは下位のネイティブドライバーが必要です。たとえば PHP で PostgreSQL を使う場合、php-pgsql パッケージを導入します。php-pgsql の場合はその中に pdo_pgsql モジュールが含まれているので、PostgreSQL の場合はネイティブドライバー(*1)経由でも PDO 経由でもそのまま使えます。
hotta:~$ rpm -ql php-pgsql
/etc/php.d/pdo_pgsql.ini
/etc/php.d/pgsql.ini
/usr/lib64/php/modules/pdo_pgsql.so
/usr/lib64/php/modules/pgsql.so
ところが RDBMS として Oracle を使いたい場合は、ライセンスの関係なのか、php-oracle のようなパッケージは公式のリポジトリでは提供されていないようです(*2)。ただ yum にこだわらなければネイティブドライバーとして Oracle Database Instant Client を利用できます。これは Oracle から無償で公開されているライブラリとユーティリティーです。
(*1)…pg_connect() 関数で接続する方式
(*2)…Oracle Linux 用の PHP パッケージというのはあるようですが、試していません。
まずはベースとなる php を導入します。ここに記載してあるすべてを入れる必要はありませんが、後から別パッケージの導入やビルド時に必要になるので、少なくとも php-pear / php-devel / php-pdo あたりは入れておく必要があるでしょう。
できれば最新の PHP-5.6 にしたいので、リポジトリとして Webtatic を使用しています。自己責任でお使いください。
root:~# yum install http://mirror.webtatic.com/yum/el7/webtatic-release.rpm root:~# yum install \ php56w-cli \ php56w-common \ php56w-devel \ php56w-enchant \ php56w-gd \ php56w-fpm \ php56w-intl \ php56w-ldap \ php56w-mbstring \ php56w-mcrypt \ php56w-mysqlnd \ php56w-opcache \ php56w-pdo \ php56w-pear \ php56w-pecl-xdebug \ php56w-pgsql \ php56w-phpdbg \ php56w-process \ php56w-soap \ php56w-xml \ php56w-xmlrpc root:~# rpm -qa|grep ^php php56w-5.6.2-1.w7.x86_64 php56w-cli-5.6.2-1.w7.x86_64 php56w-common-5.6.2-1.w7.x86_64 php56w-devel-5.6.2-1.w7.x86_64 php56w-enchant-5.6.2-1.w7.x86_64 php56w-gd-5.6.2-1.w7.x86_64 php56w-intl-5.6.2-1.w7.x86_64 php56w-ldap-5.6.2-1.w7.x86_64 php56w-mbstring-5.6.2-1.w7.x86_64 php56w-mcrypt-5.6.2-1.w7.x86_64 php56w-mysqlnd-5.6.2-1.w7.x86_64 php56w-opcache-5.6.2-1.w7.x86_64 php56w-pdo-5.6.2-1.w7.x86_64 php56w-pear-1.9.4-2.w7.noarch php56w-pecl-xdebug-2.2.5-1.w7.x86_64 php56w-pgsql-5.6.2-1.w7.x86_64 php56w-process-5.6.2-1.w7.x86_64 php56w-soap-5.6.2-1.w7.x86_64 php56w-xml-5.6.2-1.w7.x86_64 php56w-xmlrpc-5.6.2-1.w7.x86_64
Instant Client Downloads for Linux x86-64のページから必要なパッケージをダウンロードしてから導入してください。今回は以下のものをインストールしました。
root:~# rpm -Uvh oracle* root:~# rpm -qa|grep ^oracle oracle-instantclient12.1-basic-12.1.0.2.0-1.x86_64 oracle-instantclient12.1-devel-12.1.0.2.0-1.x86_64 oracle-instantclient12.1-sqlplus-12.1.0.2.0-1.x86_64
各アプリケーションが Oracle ライブラリを自動でロードできるように、おまじないを入れておきます。
root:~# echo /usr/lib/oracle/12.1/client64/lib > /etc/ld.so.conf.d/oracle-instant-client.conf
OCI(Oracle Call Interface)は Oracle とのネイティブ接続を行うための API です。OCI8 拡張は PHP コアのソースには含まれておらず、PECLにあります。
root:~# pecl install oci8
PDO_OCI は PDO 抽象化レイヤー配下で OCI 接続を実現するためのドライバで、下請けとして OCI8 を使用します。PHP_OCI は 2005 年から開発が止まっており、そのままでは動きませんので、パッチを当てたものを GitHub に置いてあります。
gcc 等が入っていなければ、事前に入れておいてください。
$ git clone https://github.com/hotta/pdo_oci $ cd pdo_oci $ phpize $ ./configure \ --prefix=/usr \ --exec-prefix=/usr \ --with-php-config=php-config \ --with-pdo-oci=instantclient,/usr,12.1 $ make $ sudo make install $ sudo cat > /etc/php.d/pdo_oci.ini <<__ ; Enable oci extension module extension=pdo_oci.so __
これで pdo_oci が使えるようになりました。
root:~# php -m|grep -i pdo_oci
PDO_OCI
rlwrap は ReadLine 非対応のプログラムを ReadLine 対応にするものです。 これを入れると sqlplus でコマンド/SQL ヒストリが使えるようになりますが、 残念ながら CentOS7 対応の RPM は見つけられませんでした。 パッケージ作るだけの元気がないので、とりあえず待つことにします。使い方等は CentOS6 向けの情報を参考にしてください。