Tech Assist

TECH & LIFE in NAGOYA

名古屋エリアでのフリーランスエンジニアとしての活動記録。

2018年10月15日

XAMPPでoci8が認識できない時の解決法

久々にどハマりしたので忘れないように書いておきます。
LaravelからOracleを使おうと思い、まずはphpinfo()でoci8を表示させようとしたところで早速つまづきました。。(^^;
私の環境とやったことは以下の通り。

<環境>
  • Windows10 Home x64
  • XAMPP7.2.10 (PHP7.2.10、Apache2.4.34)
  • Oracle12cR2(XAMPPと同じPC内にインストール)
<やったこと>
  1. Oracle Instant Clientのインストール
    https://www.oracle.com/technetwork/jp/topics/index-099943-ja.html
    ここからWindowsの32bit版(12.1.0.2.0)をダウンロードして解凍後、C:\instantclient_12_1に設置。
    環境変数の設定ウインドウからPATHにC:\instantclient_12_1を追記。
  2. php.iniの設定
    C:\xampp\php\php.iniをエディタで開いてextension=oci8_12cとextension=pdo_ociのところの;を取り除いて有効に。
  3. Apacheの再起動
これでphpinfo()を実行すればoci8が表示されるはずでしたが見当たりません。
Apacheのエラーログを確認すると
PHP Warning: PHP Startup: Unable to load dynamic library 'oci8_12c'

という警告が表示されているではないですか。。
extension_dirに該当ファイルはあるし、環境変数まわりも問題なく設定されているし、Oracle Instant Clientもちゃんと32ビット版だし、何がいけないのか全然わかりません。。

もうとにかくググるしかないのでキーワードを変えまくって調べて試すを繰り返していると、それらしき解決法を発見!試してみたらようやく動いてくれました。


答えはXAMPPのコントロールパネルの起動時に環境変数を設定してやること。
下記のような内容のバッチファイルを作って、そこからコントロールパネルを起動した後、Apacheを起動してやると無事oci8が動くようになりました。

SET PATH=C:\instantclient_12_1;C:\xampp\php;
C:\xampp\xampp-control.exe
exit

PHP7で利用したいものと違うバージョンのOCI8用dllがロードされてしまう可能性があるため、バッチファイルでパスを指定する必要があるのだそうです。
なので環境変数の設定ウインドウからPATHにC:\instantclient_12_1を追記したものを削除しても問題ありませんでした。

ちなみに気が付かれた方もいらっしゃるかもしれませんが、Instant Clientのバージョンは12.2.0.1.0ではなく12.1.0.2.0だとうまくいきました。12.2.0.1.0だと動かないのでご注意ください。
Oracleが12cR2なので本来は12.2.0.1.0をインストールするのが正しいと思うのですが、動かないので12.1.0.2.0を試してみたらとりあえず動いたといった感じです。簡単なSQLを実行してみても問題なく動いています。

<参考ページ>
https://github.com/knagashima/senbiki_plus_test/wiki/%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E6%89%8B%E9%A0%86_DB%E6%8E%A5%E7%B6%9A%E8%A8%AD%E5%AE%9A


429 (Too Many Requests)への対処法     コスパ抜群!さくらのレンタルサーバが想像以上に良かった件