Windows ServerでphpからPDOでOracleへ接続できるようにする

はじめて php から Oracle へ接続することになったのですが。

Oracle は前々職でちょろっと触った程度でほぼ初心者。

なのに WEB サーバの設定も一緒にやってくれとのこと。

ちなみに Oracle 自体は別の DB サーバで既に稼働中。

なので Oracle の設定とかはせず、WEB サーバから DB サーバへ接続できるようにするのが今回の仕事。

ちなみに環境は下記の様な状態。

  • Windows Server 2008 R2 64bit
  • IIS 7.5
  • PHP 7.3.11 64bit
  • Oracle 11g

結構試行錯誤したので、その結果を踏まえつつ設定手順を記載したいと思います。

「Oracle Instant Client」の設置

下記から「Oracle Instant Client」をダウンロードしてきます。
⇒ Oracle Instant Client Downloads

ダウンロードするのは Basic Pack。

ここで気を付けるのが bit 数。

大概のサイトは、64bit の Windows であっても 32bit 版の Oracle Instant Client をダウンロードするよう勧めていますが、自分の場合は 32bit では動作せず

PHP Warning:  PHP Startup: Unable to load dynamic library 'pdo_oci' (tried: ext\pdo_oci (指定されたモジュールが見つかりません。), ext\php_pdo_oci.dll (%1 は有効な Win32 アプリケーションではありません。)) in Unknown on line 0

とうエラーがでました。

なので 64bit 版に変えてみたところ、エラーが出なくなり Oracle に繋がるようになりました。

たぶん、Windows の bit 数というより PHP の bit 数に合わせるのかな?

正直よくわかりませんが、もしこのエラーが出た場合は bit 数を変えてみてください。

バージョンは使用している Oracle に合わせた方がいいとのことで、自分の場合は Oracle 11g なので Version 11.2.0.4.0 をダウンロードしました。

ダウンロードした zip ファイルを解凍し、適当なところに置きます。

基本的には C ドライブ直下に oracle というフォルダを作成してそこに置くようです。

環境変数を設定する

Oracle Instant Client を設置したら環境変数にそこまでのパスを設定します。

Path=C:\oracle\

同時に環境変数へ「NLS_LANG」という Oracle に対する文字コードを設定します。

これはクライアント側の文字コードを指定するものだそうなので、php なら基本 UTF-8 を使用していると思うので「Japanese_Japan.AL32UTF8」を指定します。

NLS_LANG=Japanese_Japan.AL32UTF8

この他に SJIS「Japanese_Japan.JA16SJIS」、EUC「Japanese_Japan.JA16EUC」の 3 種類があります。

基本的には Oracle 側で文字コードの変換をしてくれるそうなので、ここでの指定が間違っていたとしても大きな問題にはならないようですが、クライアント環境の OS がサポートしていない文字コード(Windows だと EUC)を指定すると文字化けが発生するようです。

この辺に関しては、下記ブログさんで詳しく紹介されています。
⇒ ふと思ったこと: Oracle文字化け

ちなみに、これを設定しないと日本語を含んだ SQL を PDO で実行し fetch もしくは fetch_all した際に、実行結果として False が返ってくるようになります。

このパターンは非常に厄介で、この場合 try-catch を設定していたとしても処理としては適切なため例外を補足しません。

挙句 Oracle 側からもエラーが返ってこない(たぶん文字化けした状態でそのまま検索してしまっている)ため、謎の False に苦しめられます。

自分はここで丸一日費やしました。

php の php_pdo_oci.dll を最新にする

たぶん最新の PHP には最新の php_pdo_oci.dll が含まれていると思うので、これは必要ないかもしれませんが念のため記載しておきます。

下記ページにアクセスし、最新バージョンの「Downloads」の欄にある Windows マーク横の「DLL」をクリック。
⇒ PECL :: Package :: oci8

表示されたページの「DLL List」に対応している PHP のバージョンが並んでいますので、該当するものをクリックしてダウンロードします。

ちなみに、「Non Thread Safe (NTS)」と「Thread Safe (TS)」のどちらを選ぶかは、WEB サーバの種類によって変わります。

IIS なら Non Thread Safe、Apache なら Thread Safe です。

なので、今回の IIS、PHP 7.3 64bit の場合は「7.3 Non Thread Safe (NTS) x64」になります。

これで設定は一通り完了です。

あとは環境変数の適用が必要になるため、OS(Windows Server)を再起動します。

コメントを残す

コメントは管理人による事前承認制です。
管理人が不適切だと判断した場合、承認せず削除することがあります。

ここにはチェックしないでください

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください