Engineering Note

プログラミングなどの技術的なメモ

PHPからOracle Database 12c Release 2(12.2.0.1)への接続設定

oracle 12c

本記事は、PHPからOracle Database 12c Release 2(12.2.0.1.0)へOCI(Oracle Call Interface)を利用して接続するための設定メモになります。

  

 

事前準備

事前準備として、前回インストールしたLinux環境(CentOS7)上のOracle Database 12c Release 2(12.2.0.1.0)のPDBを利用します。

 

 

 

 

パッケージのダウンロード

Oracle Instant Clientのダウンロード

以下のOracle公式サイトからOracle Instant Clientの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();
?>

 

fig1. oci8インストール確認

fig1. oci8インストール確認

 

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>

 

fig2. DB接続確認

fig2. DB接続確認

 

無事接続できたことが確認できました。

 

最後に

今回はPHPからOCI8を使用してOracle Database 12c Release 2へ接続する方法について学びました。

次回からはperlからOracle Database 12c Release 2へ接続するための設定について学んでいきます。