ec2のLaravel6.xとRDS(Oracle)の疎通確認をするサンプルプログラムを作った
Laravel6.x内からPHP7.4でRDS for Oracleに接続して疎通確認をするサンプルプロ
グラムを書いたので、忘れないようにやり方をメモしておく(Φω|
新規ではなく既存のOracleで構築されたdatabaseを利用するということで、
MySQL版の記事同様、DB Facadeを使い処理を行っている。
では、行ってみよう!
[手順]
0. oracle instantclientインストール。
※バージョンはサーバーの古いバージョンに合わせなくていい。
※PHP7.4でクライアントのバージョンが古すぎるとPHPコマンドで
バージョンを確認した時に下記Warningが出たので、PHPのバージョン
に合わせるべき。
$ php --version
PHP Warning: PHP Startup: Unable to load dynamic library 'oci8' (tried: /opt/remi/php74/root/usr/lib64/php/modules/oci8 (/opt/remi/php74/root/usr/lib64/php/modules/oci8: cannot open shared object file: No such file or directory), /opt/remi/php74/root/usr/lib64/php/modules/oci8.so (libclntsh.so.19.1: cannot open shared object file: No such file or directory)) in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library 'pdo_oci' (tried: /opt/remi/php74/root/usr/lib64/php/modules/pdo_oci (/opt/remi/php74/root/usr/lib64/php/modules/pdo_oci: cannot open shared object file: No such file or directory), /opt/remi/php74/root/usr/lib64/php/modules/pdo_oci.so (libclntsh.so.19.1: cannot open shared object file: No such file or directory)) in Unknown on line 0
PHP 7.4.11 (cli) (built: Sep 29 2020 10:17:06) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
※libclntsh.so.19.1は19.xのoracle-instantclient19.9をインストールすれば自動設定
される。
0-1. 公式から19.xのinstantclientをダウンロード。
ダウンロードしたのは下記。
oracle-instantclient19.9-basic-19.9.0.0.0-1.x86_64.rpm
oracle-instantclient19.9-devel-19.9.0.0.0-1.x86_64.rpm
oracle-instantclient19.9-sqlplus-19.9.0.0.0-1.x86_64.rpm
0-2.インストール前に古いバージョンをrpmコマンドでアンインストール。
$ rpm -evh oracle-instantclient12.2-basic-12.2.0.1.x86_64
$ rpm -evh oracle-instantclient12.2-sqlplus-12.2.0.1.0-1.x86_64
0-3. ec2のLaravel6がいる環境に1をMobaXtermで転送し、rpmコマンドで
インストール。
$ rpm -ivh oracle-instantclient19.9-basic-19.9.0.0.0-1.x86_64 oracle-instantclient19.9-devel-19.9.0.0.0-1.x86_64 oracle-instantclient19.9-sqlplus-19.9.0.0.0-1.x86_64 install
※分割インストールでも可。
0-4. .bashrcに下記のパスを追加。
# User specific aliases and functions 12.2で追加されていたものを19.9
に変更し反映。
export LD_LIBRARY_PATH=/usr/lib/oracle/19.9/client64/lib
export TNS_ADMIN=~/oracle/network/admin
export NLS_LANG=Japanese_Japan.AL32UTF8$ source ~/.bashrc
※ターミナルからsqlplus64で疎通確認し、接続できればOK。
1. yumでoci8とpdo_ociをインストール。
$ sudo su -
※こちらをインストールせずにcomposerでlaravel-oci8をインストール
しようとして大分、ハマったので注意。
※php74-php-oci8のインストールでoci8とpdo_ociの両方が入る。
1-1. oci8やpdo_ociのインストール状況は下記コマンドで確認。
$ php -m
[PHP Modules]
bcmath
bz2
calendar
Core
ctype
curl
date
dom
exif
fileinfo
filter
ftp
gd
gettext
hash
iconv
json
libxml
mbstring
mysql
mysqli
mysqlnd
oci8
openssl
pcntl
pcre
PDO
pdo_dblib
PDO_Firebird
pdo_mysql
PDO_OCI
pdo_sqlite
Phar
readline
Reflection
session
SimpleXML
sockets
sodium
SPL
sqlite3
standard
tokenizer
xml
xmlreader
xmlwriter
xsl
zip
zlib
2. composerでlaravel-oci8をインストール。
$ composer require yajra/laravel-oci8:^6
※もちろんswapを1GBほど作成してから実行するのを忘れずに。
3. Laravelプロジェクトのルートで下記コマンドを実行。
$ php artisan vendor:publish --tag=oracle
Copied File [/vendor/yajra/laravel-oci8/src/config/oracle.php] To [/config/oracle.php]
Publishing complete.
4. 3で生成された設定ファイル(config/oracle.php)を自分の環境に合わせて編集。
'oracle' => [
'driver' => 'oracle',
'host' => 'oracle.host',
'port' => '1521',
'database' => 'xe',
'service_name' => 'sid_alias',
'username' => 'hr',
'password' => 'hr',
'charset' => '',
'prefix' => '',
]※prefix以外を自分の環境に合わせて修正し、今回は.envの設定を
利用しない。
※charsetはほぼ'AL32UTF8'で固定。
5. routes/web.php を編集。
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/Route::get('/user', 'UserController@index');
Route::get('/orauser', 'OraUserController@index'); // 今回追加
6. app/Http/Controller/OraUserController.php 作成。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;class OraUserController extends Controller
{
public function index()
{
$users = DB::connection('oracle')->select("select * from users");
$data = ['msg' => 'ユーザ一覧', 'users' => $users];
return view('orauser.index', $data);
}
}
7. resources/views/orauser/index.blade.php 作成。
<h1>{{ $msg }}</h1>
<ul>
@foreach ($users as $user)
<li>{{ $user->usr_name }}</li>
@endforeach
</ul>
8. 一応、cacheクリア。
$ php artisan cache:clear
$ php artisan config:clear
$ php artisan route:clear
$ php artisan view:clear※php artisanコマンドはLaravelプロジェクトのルートで実行。
9. apache再起動。
$ sudo su -
# systemctl restart httpd(.service) --- ()は省略可能
10. Webブラウザでhostsに設定しているservernameでアクセスし、
sqlplus64で同じクエリーを実行した場合と結果が同じであればOK。
[参考サイト]
Installing OCI8 & PHP 7.2 on RHEL or CentOS 6alvinbunk.wordpress.com