Laravel + Vue + postgresql on Homestead で開発していて、
要件から外部のOracleへも別途接続しなくてはならなくなりました。
Oracleの場合は、mysqlやpostgresqlと違って結構手間がかかったので
ぶつかった課題の解決方法含めてメモ。
今回は試験として、AWSのRDSにてインターネット経由でOracleのインスタンスに
接続できるようにこちらを参考に構築して試しました。
※ありがとうございます!
まずは手順
おおまかな手順としては、
・Oracle Instant Clientをインストール
・oci8インストール
・PDO_OCIインストール
・Laravel設定となります。
ここでPDO_OCIインストールまではこちらを参考にざっくりと進めました。
Laravel設定はこちらを参考にしました。
課題1 コンパイルバージョンが合わない!
手順通りコマンドを実行していって、php -vで表示してみたところ、
peclや、make installしたときのバージョンが合わない問題が発生して、
稼働しているPHPから参照できなかったです。
具体的には、
Module compiled with module API=20180731 PHP compiled with module API=20210902
こんな感じになってしまいました。
日付が入っているので「?」となりましたが、
要するにコンパイルしたときのモジュールのバージョンと
動作しているPHPのバージョンが違うよということみたいです。
Homesteadの中にはたくさんのPHPのバージョンが
あるので、デフォルトと違うバージョンを指定していると起こってしまいそうですね。
解決策としては、今回の場合であれば、
sudo update-alternatives --config php
で、Homesteadで指定しているPHPのバージョンに合わせればOK。
僕の場合は、–config phpの他にphp-configとphpizeも変えました。
php-configはpecl installのために、phpizeはmake installのためにって感じですね。
課題2 OCI8 installでPHPバージョンが合わない!
次は、peclでOCI8をインストールするときに、
sudo pecl install oci8
これだと、
phpバージョンが8以上じゃないとダメ!って怒られました。
解決策としては、oci8のバージョン指定です。
PHP7以上だと↓の方法(2.2.0指定)でよいそうですよ。
sudo pecl install oci8-2.2.0
課題3 OCI8とPDO_OCIは読み込めたっぽいけどphpinfoに出てこない!
無事、php -vでエラーも出ないし、php -iでロードされているっぽいことは
確認できました。
でも、
Undefined constant OCI_CRED_EXT
こんな感じのエラーで接続できない!
定数が定義されていないとは??みたいに思いましたが、
どうやらOCI8が動作していないことが原因のようです。
そこで調べてみると、phpinfoにOCI8のセクションが表示されていない。
なるほど、読み込めたけど動いてなかったってことねと。
これが今回の一番のハマりどころでした。
解決策としては、
sudo vi /etc/php/7.3/mods-available/oci8.ini ↓ この1行だけ書いて保存 extension=oci8.so sudo ln -s /etc/php/7.3/mods-available/oci8.ini /etc/php/7.3/fpm/conf.d/20-oci8.i ni sudo vi /etc/ld.so.conf.d/oracle.conf ↓ この1行だけ書いて保存 /usr/lib/oracle/12.1/client64/lib sudo ldconfig
oci8.soのextensionの記述をmods-availableの下にoci8.iniを作成し、
fpm/conf.d配下にシンボリックリンクを作成したこと。
また、oracle.confを作成してldconfigしたこと。
の2つでOCI8がphpinfoに表示されるようになりましたー!!
課題4 laravel-oci8インストールでバージョン不整合
composer require yajra/laravel-oci8
これだけだと、最新がインストールされるので、
laravelのバージョンと合わないとエラーになりました。
解決策としては、
php artisan -V
でlaravelのバージョンを確認。
その後で、
composer require yajra/laravel-oci8:6.*
みたいに「確認したメジャーバージョン.*」とすると、
laravelバージョンにあったlaravel-oci8がインストールされます。
課題5laravel-oci8のインストールでメモリ割当上限エラー
課題4の対応後、順調に処理が進んでいたのですが、
メモリ割当のlimitに達してエラーになってしまいました。
解決策としては、
php -d memory_limit=-1 composer.phar require yajra/laravel-oci8:6.*
として、memory_limitを設けないで実行することで解消しました。
まとめ
以上、laravelからOracleへ接続するために、
サイトどおりやってみて解決にハマってしまったことのメモでしたー。
誰かの助けになれば幸いですー。
20代前半までは東京で音楽をやりながら両手の指以上の業種でアルバイト生活をしていましたが、某大手プロバイダのテレアポのバイトでPCの知識の無さに愕然とし、コンピュータをもっと知りたい!と思ったことをきっかけに25歳の時にITの世界に未経験で飛び込みました。
紆余曲折を経て、現在は個人事業主としてお仕事させていただいており、10年ほどになります。
web制作から企業システム構築、ツール開発など、フロントエンドもバックエンドもサーバーもDBAも依頼があれば何でもやってきた雑食系エンジニアです。
今風にいうとフルスタックエンジニアということになるのでしょうか??
→ 詳細プロフィールというか、生い立ちはこちら
→スキルシートをご覧になる場合はこちら
→お仕事のご依頼やお見積りなどお問い合わせはこちらから!