PHPからOracle Database 12c Release 2(12.2.0.1)への接続設定
本記事は、PHPからOracle Database 12c Release 2(12.2.0.1.0)へOCI(Oracle Call Interface)を利用して接続するための設定メモになります。
- 事前準備
- パッケージのダウンロード
- PHPのインストール
- Oracle Instant Clientのインストール
- OCI8のインストール
- phpinfoからインストールの確認
- PHPからOracle Databaseに接続
- 最後に
事前準備
事前準備として、前回インストールしたLinux環境(CentOS7)上のOracle Database 12c Release 2(12.2.0.1.0)のPDBを利用します。
パッケージのダウンロード
Oracle Instant Clientのダウンロード
以下のOracle公式サイトからOracle Instant Clientのrpmファイルをダウンロードします。
- oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm
- oracle-instantclient12.2-devel-12.2.0.1.0-1.x86_64.rpm
- oracle-instantclient12.2-sqlplus-12.2.0.1.0-1.x86_64.rpm
sqlplusは無くても大丈夫ですが、後々perlのDBD::Oracleをインストールする際に必要になるので、ついでにダウンロードとインストールもしておきます。
OCI8のダウンロード
以下のPECL(ピクル)からOCI8のtgzファイルをダウンロードします。
なお、今回はphp.5.4.16-46のバージョンを利用しますので、最新のOCI8ではPHPのVersion7以降しかサポートしないため、oci8-2.0.12.tgzをダウンロードします。
https://pecl.php.net/package/oci8/
- oci8-2.0.12.tgz
PHPのインストール
まずyumからPHPとOCIに必要なパッケージも併せてインストールします。
> yum -y install php \ php-pear \ php-cli \ php-devel
上記でPHPをインストールすると依存関係のあるhttpdも一緒にインストールされるので(未インストールの場合)、起動とポートの開放をしておきます。
> service httpd start > firewall-cmd --add-service=http --permanent > firewall-cmd --reload
Oracle Instant Clientのインストール
次にOracle Instant Clientをインストールします。
> rpm -ivh oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm \ oracle-instantclient12.2-devel-12.2.0.1.0-1.x86_64.rpm \ oracle-instantclient12.2-sqlplus-12.2.0.1.0-1.x86_64.rpm
OCI8のインストール
最後にOCI8をインストールします。
> echo "extension=oci8.so" > /etc/php.d/90_oci8.ini > C_INCLUDE_PATH=/usr/lib/oracle/12.2/client64 pecl install oci8-2.0.12.tgz
上記2つ目のコマンドを入力した際に、途中で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] :
と入力を求められますが、ここでは自動検知で良いため、そのままEnterを押下しインストールを完了させます。
phpinfoからインストールの確認
上記でインストールできたかどうかをphpinfo()
から確認します。
以下のPHPコードを配置し、ブラウザから確認してみます。
<?php phpinfo(); ?>
PHPからOracle Databaseに接続
準備が整ったので、以下のPHPテストコードからDBに接続してみます。
使用するDBは前回作成したPDB1になります。
事前にインスタンスとリスナーも起動しておきます。
なお、php
コマンドからスクリプトとしてDBに接続する際は問題ありませんが、SElinuxが有効の場合、httpdにてブラウザからアクセスする際にディレクトリのパーミッション($ORACLE_HOMEが755)が正しく設定されていても、ORA-12546: TNS:permission denied
のエラーが出てしまうので、SELinuxは無効にしておいたほうが良いです。
# test_con.php <!DOCTYPE html> <html> <head> <style> tr { text-align: center; } </style> </head> <body> <?php $conn = oci_connect('ora01', 'oracle', 'localhost/pdb1'); if (!$conn) { $e = oci_error(); trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR); } $stid = oci_parse($conn, 'SELECT * FROM Test ORDER BY ID'); oci_execute($stid); echo "<table border='1' width=300>"; echo "<tr><th>ID</th><th>name</th></tr>"; while (oci_fetch($stid)) { echo "<tr>"; echo "<td>" . oci_result($stid, 'ID') . "</td>"; echo "<td>" . oci_result($stid, 'NAME') . "</td>"; echo "</tr>"; } echo "</table>"; oci_close($conn); ?> </body> </html>
無事接続できたことが確認できました。
最後に
今回はPHPからOCI8を使用してOracle Database 12c Release 2へ接続する方法について学びました。
次回からはperlからOracle Database 12c Release 2へ接続するための設定について学んでいきます。