PHPでUnable to load dynamic library 'oci8_12c'となった時の対応方法


  • 環境
    • Windows10 Pro 64bit
    • PHP 7.3.14(32bit)

事象 : PHPコマンドでDLLがないと怒られた

Oracleデータベース(12c)を使うのでphp.iniでコメントアウトを外したら、怒られた。

oci8_12cとpdo_ociのコメントアウトを外した
;省略
extension=oci8_12c  ; Use with Oracle Database 12c Instant Client
;extension=odbc
;extension=openssl
;extension=pdo_firebird
;extension=pdo_mysql
extension=pdo_oci
;省略
怒られた
$ php -v
PHP Warning:  PHP Startup: Unable to load dynamic library 'oci8_12c' (tried: C:\apps\php-7.3.14-Win32-VC15-x86\ext\oci8_12c (指定されたモジュールが見つかりません。), C:\apps\php-7.3.14-Win32-VC15-x86\ext\php_oci8_12c.dll (%1 は有効な Win32 アプリケーションではありません。)) in Unknown on line 0

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

Warning: PHP Startup: Unable to load dynamic library 'php_pdo_oci.dll' (tried: C:\apps\php-7.3.14-Win32-VC15-x86\ext\php_pdo_oci.dll (%1 は有効な Win32 アプリケーションではありません。), C:\apps\php-7.3.14-Win32-VC15-x86\ext\php_php_pdo_oci.dll.dll (指定されたモジュールが見つかりません。)) in Unknown on line 0
PHP 7.3.14 (cli) (built: Jan 21 2020 13:17:19) ( ZTS MSVC15 (Visual C++ 2017) x86 )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.14, Copyright (c) 1998-2018 Zend Technologies
    with Xdebug v2.9.1, Copyright (c) 2002-2020, by Derick Rethans

# dllは所定のフォルダに格納されています。
$ ls -la /c/apps/php-7.3.14-Win32-VC15-x86/ext | grep oci
-rwxr-xr-x 1 pon 197609  132096 1月  21 14:20 php_oci8_12c.dll*
-rwxr-xr-x 1 pon 197609   26624 1月  21 14:20 php_pdo_oci.dll*

原因 : Oracle Database 12c Instant Clientがないから

ちゃんとphp.iniに書いてある・・・・そういえば以前のPCではSQL*PLUSをインストールしていた。

php.ini
extension=oci8_12c  ; Use with Oracle Database 12c Instant Client

対応 : Instant Clientを配置する

失敗した対応 : PHPと違うbitのInstant Clientを配置した

  1. OInstant Client Downloads for Microsoft Windows (x64) 64-bitから「Version 12.2.0.1.0」のzipをダウンロードして使った。
  2. 事象は全く解決しなかった...

成功した対応 : PHPと同じbitのInstant Clientを配置した

  1. PHPのbitを確認する
  2. 「x86(32bit)」なのでInstant Client Downloads for Microsoft Windows 32-bitから「Version 12.2.0.1.0」のinstantclient-basiclite-nt-12.2.0.1.0.zipをダウンロードして使った。
  3. ダウンロードしたzipを任意の場所に解凍する
  4. 解凍したフォルダへPATHを通す
# PHPのバージョンを確認する
$ php -r 'echo PHP_INT_SIZE;'$ php -r 'echo PHP_INT_SIZE;'
4

# ダウンロードしたzipを任意の場所に解凍する
$ unzip ~/Downloads/instantclient-basiclite-nt-12.2.0.1.0.zip -d /c/apps/oracle
Archive:  /c/Users/pon/Downloads/instantclient-basiclite-nt-12.2.0.1.0.zip
   creating: /c/apps/oracle/instantclient_12_2/
  inflating: /c/apps/oracle/instantclient_12_2/oraocci12.sym
  inflating: /c/apps/oracle/instantclient_12_2/oraociicus12.dll
  inflating: /c/apps/oracle/instantclient_12_2/uidrvci.sym
  inflating: /c/apps/oracle/instantclient_12_2/ocijdbc12.dll
  inflating: /c/apps/oracle/instantclient_12_2/xstreams.jar
  inflating: /c/apps/oracle/instantclient_12_2/orasql12.sym
  inflating: /c/apps/oracle/instantclient_12_2/oraocci12d.dll
  inflating: /c/apps/oracle/instantclient_12_2/genezi.exe
  inflating: /c/apps/oracle/instantclient_12_2/ojdbc8.jar
  inflating: /c/apps/oracle/instantclient_12_2/adrci.exe
  inflating: /c/apps/oracle/instantclient_12_2/BASIC_LITE_README
  inflating: /c/apps/oracle/instantclient_12_2/oraocci12d.sym
  inflating: /c/apps/oracle/instantclient_12_2/orasql12.dll
  inflating: /c/apps/oracle/instantclient_12_2/oraociicus12.sym
  inflating: /c/apps/oracle/instantclient_12_2/oraocci12.dll
  inflating: /c/apps/oracle/instantclient_12_2/ocijdbc12.sym
  inflating: /c/apps/oracle/instantclient_12_2/orannzsbb12.dll
  inflating: /c/apps/oracle/instantclient_12_2/ociw32.sym
  inflating: /c/apps/oracle/instantclient_12_2/adrci.sym
   creating: /c/apps/oracle/instantclient_12_2/vc14/
  inflating: /c/apps/oracle/instantclient_12_2/vc14/oraocci12d.sym
  inflating: /c/apps/oracle/instantclient_12_2/vc14/oraocci12d.dll
  inflating: /c/apps/oracle/instantclient_12_2/vc14/oraocci12.dll
  inflating: /c/apps/oracle/instantclient_12_2/vc14/oraocci12.sym
  inflating: /c/apps/oracle/instantclient_12_2/oci.dll
  inflating: /c/apps/oracle/instantclient_12_2/oraons.dll
  inflating: /c/apps/oracle/instantclient_12_2/genezi.sym
  inflating: /c/apps/oracle/instantclient_12_2/ociw32.dll
  inflating: /c/apps/oracle/instantclient_12_2/oci.sym
  inflating: /c/apps/oracle/instantclient_12_2/uidrvci.exe
  inflating: /c/apps/oracle/instantclient_12_2/orannzsbb12.sym

# 解凍したフォルダへPATHを通す
$ printenv PATH | sed -e 's/:/:\n/g' | grep ora
/c/apps/oracle/instantclient_12_2_x32:

# 対応結果
$ php -v
PHP 7.3.14 (cli) (built: Jan 21 2020 13:17:19) ( ZTS MSVC15 (Visual C++ 2017) x86 )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.14, Copyright (c) 1998-2018 Zend Technologies
    with Xdebug v2.9.1, Copyright (c) 2002-2020, by Derick Rethans