AWS+CentOS7+PHP7.1+oci8-2.1.8 でRDSオラクルに接続


環境

AWS EC2インスタンス
Centos7.6.1810
PHP7.1.26
Apache2.4.6
oci2.1.8

--接続先--
RDS Oracle 12.1.0.2.v5

前提

接続先のRDSと同じVPC内にEC2インスタンスをたてる(※私がハマったポイントです..)

それでは順にご紹介させていただきます!

1: Instant Clientをダウンロード

・下記公式サイトにアクセス
https://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html

・下記2つのファイルをダウンロードして、/tmpに保存。
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

2: 準備

# yum install libaio
※これがないと怒られた......

# cd /tmp
※先ほどInstant Client保存した場所に移動

# rpm -ivh oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm
# rpm -ivh oracle-instantclient12.2-devel-12.2.0.1.0-1.x86_64.rpm 

・tnsnames.oraファイルを作成する

# mkdir -p /usr/lib/oracle/12.2/client64/network/admin
# vi /usr/lib/oracle/12.2/client64/network/admin/tnsnames.ora

※下記を追加して保存
[DBName] =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = [エンドポイント])(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcl)
    )
  )

・パスを通す

#vi /etc/profile

※下記を追加して保存
export ORACLE_HOME=/usr/lib/oracle/12.2/client64/lib
export NLS_LANG=Japanese_Japan.AL32UTF8
export LD_LIBRARY_PATH=$ORACLE_HOME:$LD_LIBRARY_PATH
export PATH=$ORACLE_HOME:$PATH

# source /etc/profile 
※強制反映

・DTraceサポートを有効にする

# yum -y install systemtap-sdt-devel
# export PHP_DTRACE=yes
# pecl channel-update pecl.php.net
※これがないとこの後怒られる
# yum -y install gcc
※またまたこれもないとこの後怒られてしまう

3:OCI8のインストール

# pecl install oci8-2.1.8 ※バージョン指定

途中プロントが出てきますので下記入力
instantclient,/usr/lib/oracle/12.2/client64/lib

・php.iniに設定

# vi /etc/php.ini
extension=oci8.so ※追加

# systemctl restart httpd.service ※Apache再起動
# php -m | grep oci ※モジュールが読み込まれているか確認
oci8

# php --rf oci_connect ※「oci_connect」関数が存在するかチェック。
Function [ <internal:oci8> function oci_connect ] {

  - Parameters [5] {
    Parameter #0 [ <required> $username ]
    Parameter #1 [ <required> $password ]
    Parameter #2 [ <optional> $connection_string ]
    Parameter #3 [ <optional> $character_set ]
    Parameter #4 [ <optional> $session_mode ]
  }
}

・ここまでで接続可能になっているはず!
phpinfo.phpにもoci8が表示されています。

4:PHPを使って接続確認

oci8_test.php

$conn = oci_connect('[ユーザー名]','[パスワード]','[エンドポイント]/orcl','AL32UTF8');

if (!$conn) {
    $e = oci_error();
    trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}else{
    echo "接続完了!";
}

画面に「接続完了!」とでたら成功です!!!!
私が一番ハマったのは、前述したようにRDSのVPCと別のVPCにインスタンスを作ってしまった事です....。

参考URL
https://mike-neko.github.io/blog/oracle-cent/