【Laravel】Oracleへの接続設定の方法(Windows版)

普段はMySQLだけど、どうしてもOracleを参照しないといけなくなったときのTODO

2018/03/27 手順修正

環境

Windows7
Laravel 5.5(PHP7.1)
Oracle9i Database Release 2 (9.2.0)
XAMPP 7.1.7

接続設定の方法

1.オラクルインスタントクライアントを公式サイトからダウンロードする

Link:http://www.oracle.com/technetwork/jp/topics/index-099943-ja.html

オラクルインスタントクライアントとは、OracleDBに接続するためのものを最小限にまとめたライブラリ
ここでは都合により最新バージョンの12.2(2018/03時点)ではなく11.2をダウンロードする

・instantclient-basic-nt-11.2.0.4.0.zip
→フォルダを解凍後、instantclient_11_2にリネームしてCドライブ直下に設置する

2.環境変数を以下の通りに変更する
変数名:PATH
値:C:\instantclient_11_2;<元々の設定値>  

変数名:NLS_LANG
値:Japanese_Japan.AL32UTF8
3.コマンドプロンプトから環境変数が設定されているか確認する
C:\Users\hoge>set
...省略...
NLS_LANG=Japanese_Japan.AL32UTF8
Path=C:\instantclient_11_2;C:\Program Files (x86)~・・・
...省略...
4.C:\xampp\php\php.iniの末尾に追記する
extension=php_oci8_11g.dll
extension=php_pdo_oci.dll

★注意
PHP: 要件 - Manual より

OCI8 が 9iR2 のクライアントライブラリを使っている場合は、PHP から Oracle Database 8i, 9iR2, 10g あるいは 11g に接続することができます。 OCI8 が 10gR2 のクライアントライブラリを使っている場合は、接続できるデータベースは 9iR2, 10g, 11g あるいは 12c です。 OCI8 が 11g のクライアントライブラリを使っている場合は、接続できるデータベースは 9iR2, 10g, 11g あるいは 12c です。 OCI8 が 12c のクライアントライブラリを使っている場合は、接続できるデータベースは 10gR2, 11g あるいは 12c です。

まとめると、
php_oci8_11g.dll: 9iR2、10g、11g、12cのDBに接続できる(9i以前かつ10gR2は接続できない)
php_oci8_12c.dll: 10gR2、11g、12cのDBに接続できる(10g以前は接続できない)

extensionで指定したファイルはC:\xampp\php\extに格納されているが、XAMPP 7.1.7ではphp_oci8_11g.dllがデフォルトで入っておらず、php_oci8_12c.dllのみ設置されている。
9iR2に接続するためにはphp_oci8_11g.dllが必要なため、自力で入手する。(XAMPP5.5.19に発見したのでZIPから取得するとよい)
 
入手後、php_oci8_11g.dlをC:/xampp/php/extに設置する。
※もしphp_oci8_12c.dll適用したい場合、手順1のオラクルインスタントクライアントのバージョンを12してやり直す

5.C:\xampp\xampp-control.exeを起動し、STARTを押してApacheを起動する

起動時に「OCI.dllが見つかりません」的なエラーが出た場合、オラクルインスタントクライアントを参照できていないので環境変数を見直すこと ユーザー環境変数に定義していた場合はシステム環境変数に設定してみる

6.ブラウザからhttp://localhost/dashboard/phpinfo.phpにアクセスし、以下の通りOCI8のブロックが表示されていればOK

f:id:hikeshiya:20180322130348p:plain

7.C:\xampp\xampp-control.exeからSTOPを押してApacheを終了する
8.Laravel-oci8をcomposerでインストールする
composer require yajra/laravel-oci8:"5.5.*"

LaravelというフレームワークにはIlluminate/DatabaseにDB操作を行うモジュールが実装されていて、Laravel-oci8はこれをOracle向けに拡張したもの。
Laravel-oci8とLaravelのバージョンと統一しないといけないため、Laravelのバージョンが5.6の場合は"5.6.*"と指定しないといけない。
github.com

手順6でOCI8のブロックが表示されていない場合、インストール時に以下のエラーが発生する

yajra/laravel-oci8 v5.5.5 requires ext-oci8 >=2.0.0 -> the requested PHP extension oci8 is missing from your system.
9.Laravelのプロジェクトフォルダを開き、以下の内容で各ファイルを編集する

config/app.php(Laravel 5.5以上の場合のみ追記する)

Yajra\Oci8\Oci8ServiceProvider::class,

 
config/database.php

    ...省略...

    'connections' => [
       'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            ... 省略 ...
       ],
       'oracle' => [
            'driver' => 'oracle',
            'host' => env('DB_HOST2', '127.0.0.1'),
            'port' => env('DB_PORT2', '3306'),
            'database' => env('DB_DATABASE2', 'forge'),
            'username' => env('DB_USERNAME2', 'forge'),
            'password' => env('DB_PASSWORD2', ''),
            'unix_socket' => env('DB_SOCKET2', ''),
            'charset' => env('DB_CHARSET2', 'AL32UTF8'),
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => false,
            'engine' => null,
        ],

    ...省略...

 
.env

# mysql
DB_HOST=192.168.xxx.xxx
... 省略 ...

# oracle
DB_HOST2=192.168.xxx.xxx
DB_PORT2=8000
DB_DATABASE2=hoge_db
DB_USERNAME2=hoge
DB_PASSWORD2=hoge
DB_CHARSET2=AL32UTF8
10.コマンドプロンプトからローカルサーバーを起動する
php artisan serv
11. プロジェクト内の適当なファイルに以下のコードを記載し、OracleDBを参照できていれば接続設定完了
$rows = \DB::connection('oracle')->select('SELECT * FROM TEST_TABLE');
dd($rows);