PHPからOracleへ接続する機会が少ないかと思いますが、今回、PHPで提案したシステムが、お客様の基幹システム側のOracleを使っている(一元化する)ため、PHPからOracleへの接続せざるを得ない状態に陥ってしまいました。
ネット上に情報がありますが、古かったり、足りなかったりすることで、分かれば、正常30分くらいの作業なのに、苦労して一日を使ってしまいました。あとからの方が、筆者の苦しみを二度と味わわないため、ここでWindows環境において、PHPからOracleへの接続方法を紹介したいと思います。
前提条件
Windows環境
接続方法
PHPからOracleへの接続方法は下記の通り、4つのステップだけで完成できます。
<PHPからOracleへの接続方法>
1.OCIをインストール
2.環境変数を設定
3.Oracle拡張モジュールDLLをインストール
4.php.iniを設定
今から見ますと、非常に簡単ですが、何も知らない方にとって、何か必要、何を注意、何を設定すれば良い、このファイルは本当に必要、この設定が大丈夫など、当初の筆者と同じように、半信半疑、とても難しい作業ではないかと思います。
実際に、上記の方法に落とし穴があります。それは、Oracleのバージョンによって、OCIの依存するMSVCが必要する場合があります。更に、MSVCをインストールするだけではなく、正しいMSVCバージョンをインストールしない限り、Oracleへの接続がうまくできません。ですので、正確に言えば、PHPからOracleへの接続方法は下記の通りです。
<PHPからOracleへの正しい接続方法>
1.OCIをインストール
1.1.MSVCをインストール
2.環境変数を設定
3.Oracle拡張モジュールDLLをインストール
4.php.iniを設定
1.OCIをインストール
下記のURLから、Oracleのバージョンに応じて、必要なOCIをダウンロードし、ローカルに解凍します。(分かりやすく説明するため、ここは、「c:\instantclient_12_1」に解凍したことにします。)
<Windows 32bit>
https://www.oracle.com/database/technologies/instant-client/microsoft-windows-32-downloads.html
<Windows 64bit>
https://www.oracle.com/database/technologies/instant-client/winx64-64-downloads.html
ちなみに、OCIとは、Oracle Call Interfaceの略で、ネイティブなC言語ベースのインタフェースです。C言語で作られていたので、これはMSVCが必要となる理由です。
1.1.MSVCをインストール
オプションですが、Oracleのバージョンが12.1以上であれば、このステップが必要となります。前述の通り、必ず、必要となったMSVC(Microsoft Visual Studio XXXX Redistributable)をインストールしてください。
MSVCのダウンロード場所は、下記の通りです。(No.1でOCIをインストールするURLからもたどり着けると思います。)
https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads
追記:上記URLからダウンロードできなくなりました。下記からダウンロードしてください。
Microsoft Visual C++ 2010 再頒布可能パッケージ<Windows 64bit>
https://www.microsoft.com/ja-jp/download/details.aspx?id=14632
もう一度言わせてくだい。
勘違いしないように、注意してほしいのは、例えば、Oracle 12.1のOCIの場合、MSVC2010が必要ですが、最新版のMSVC2019をインストールしたら、申し訳ございません、Oracleへ接続できません。いくら頑張って設定し直しても、無駄です。エラーでまくりです。(
筆者はここではまってしまいました。)
正しいMSVCをインストールしないと、Apacheの場合、下記のようなエラーログを吐き出します。
1 2 3 4 5 |
PHP Warning: PHP Startup: Unable to load dynamic library 'C:\\xampp\\php\\ext\\php_oci8_12c.dll' - \xef\xbf\xbdw\xef\xbf\xbd\xe8\x82\xb3\xef\xbf\xbd\xea\x82\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbdW\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd[\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xc2\x82\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xdc\x82\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbdB\r\n in Unknown on line 0 |
2.環境変数を設定
Windowsの環境変数画面を開いて、(ユーザー環境変数ではなく)システム環境変数ブロックのPath変数に、No.1の「c:\instantclient_12_1」を追加します。
環境変数を設定せずに、No.1のDLLファイルをPHPのlibフォルダに入れても可能ですが、PHPのオリジナルライブラリに、外来種を入れるのは、分離の考え方から考えますと、やはり、やめたほうがよいではないかと思います。変なエラーが発生時に、原因が分からなくなる可能性が極めて高いし。
※環境変数を変更したら、PCを再起動したほうが無難だと思います。作業をスムーズに進めるように、再起動しましょう。
3.Oracle拡張モジュールDLLをインストール
PHPバージョンとOracleバージョンによって、このステップが必要となる場合があります。実際にこのステップがオプションですね。(筆者の場合、このステップが必要となったため、オプションではなく、ワンランクを上げました。すみませんでした!! m(_ _)m )
当時のプロジェクトは、古いシステムと同じ筐体なので、PHP5.3を使って、Oracle12へ接続する要件でした。PHP5.3は、Oracle10,11の拡張モジュールDLLを提供してありましたが、Oracle12の拡張モジュールDLLを提供てなかったため、独自でインストールせざるを得ない状況になりました。
インストールする前に、下記の情報を事前に把握できたら、スムーズに進めると思います。(その理由はすぐ説明します。)
1.PHPのバージョン(「phpinfo()のVersion」から判断できます)
2.PHPのThread Safety(「phpinfoのThread Safety」から判断できます)
3.Windowsが32bitか64bitか
拡張モジュールDLLのダウンロード先が、下記の通りです。
https://pecl.php.net/package/oci8
上記のURLに、「Description」で記述の通り、PHPのバージョンによって、拡張モジュールDLLの内容が変わりますので、ご注意ください。(筆者の場合、PHP5.3なので、「oci8-1.4.10」となりました)
PHPのバージョンを決めて、該当する拡張モジュールDLLの「DLL」リンクをクリックしたら、次の画面が表示されて、中に、更にいくつのリンクが表示されると思います。(筆者の場合、「https://pecl.php.net/package/oci8/1.4.10/windows」となります。)
どのリンクが必要な拡張モジュールDLLかというと、それは、上記の3点で決めると思います。
例:筆者の場合
1.PHPのバージョン:5.3
2.PHPのThread Safety: enabled ⇒Thread Safe (TS)
3.Windowsが32bitか64bitか:x64 ⇒ 該当ないため、32bitの「5.3 Thread Safe (TS) x86 」を決めました。
上記からダウンロードした拡張モジュールDLLを解凍し、今回はOracle 12に接続しますので、「php_oci8_12c.dll」ファイルをPHPの「ext」フォルダにコピーします。
もう一度言わせてくだい。このステップはオプションです。必要な拡張モジュールDLLが既に存在する場合、この手順は不要です。ご注意ください。
4.php.iniを設定
いよいよ、最終ステップに入ります。筆者の場合、ここまでは、8時間くらいかかりました。悲しいですね。。。。
さて、No.3でインストールした、または、そもそも存在した、Oracle拡張モジュールDLLをphp.ini設定からコメントアウトすれば、このステップの作業が終わりです。
1 2 3 4 5 6 |
;extension=php_oci8_12c.dll ⇒ extension=php_oci8_12c.dll (存在したら、コメントアウト、存在しないなら、追加) ;extension=php_pdo_oci.dll ⇒ extension=php_pdo_oci.dll |
まとめ
ここまで、PHPからOracleへの接続方法を紹介しました。いかがでしょうか、MSVCバージョンのところが分かれば、実に簡単ですよね。設定作業が完了したら、テスト作業も必要となると思いますが、その作業は、後日に、別途で紹介させていただきます。それでは、また!(何かの不明な点等ございましたら、ぜひ連絡ください。)