【问题标题】:php_oci8_11g.dll is not a valid Win32 applicationphp_oci8_11g.dll 不是有效的 Win32 应用程序
【发布时间】:2016-12-07 03:12:13
【问题描述】:

这个话题已经被问过好几次了,但每个解决方案都不能在我的机器上运行。

我正在尝试将 Windows 7 与 10G oracle 数据库连接,但未加载 oci 扩展。这里有一些事实:

C:\php>php -m

PHP 警告:PHP 启动:无法加载动态库 'C:\php\ext\php_oci8_11g.dll' - %1 不是有效的 Win32 应用程序。

C:\php>php -v

PHP 5.6.19 (cli) (built: Mar  2 2016 20:09:42)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
  • 64x 架构
  • TS VC11

C:\>tnsping localdb

TNS Ping Utility for 32-bit Windows: Version 10.2.0.1.0 - Production on 02-AUG-2
016 22:37:50

疑难解答

  • 我正在使用oci8 2.0.11。将它们放入ext/ 折叠。其余的扩展都加载得很好。
  • PATH 变量包含 ORACLE_HOME 和 php 路径
  • 刚刚查找了所需的 oracle dll 文件,它们就在那里:

    C:\>where oci*

    C:\oracle\product\10.2.0\db_2\BIN\oci.dll
    C:\oracle\product\10.2.0\db_2\BIN\ocijdbc10.dll
    C:\oracle\product\10.2.0\db_2\BIN\ociw32.dll
    
  • 我这边不需要Oracle Client,因为数据库安装在同一台机器上,它安装了所有需要的库

我还缺少什么?提前谢谢你

【问题讨论】:

  • 您说 PHP 是 x64,但是您的 Oracle 安装是什么? “位数”需要匹配。

标签: php oracle windows-7 php-5.6


【解决方案1】:

这是一个可行的解决方案:

  1. 首先,您需要确定您使用的是 PHP x86 还是 x64。最简单的方法是使用以下代码:
<?php echo PHP_INT_SIZE; ?>

如果您得到4,则表示您使用的是PHP x86。 如果你得到8,说明你使用的是PHP x64。

  1. 然后,您需要下载与您的 PHP 架构相匹配的 Oracle 版本:例如,如果您使用 PHP x86,请下载 x86 版本的 Oracle。 您不能混合版本。

11G 版:

版本 12C:

https://www.oracle.com/technetwork/database/enterprise-edition/downloads/oracle12c-windows-3633015.html 下载 Oracle Database 12c Release 2 Client (12.2.0.1.0) for Microsoft Windows (x64)Oracle Database 12c Release 2 Client (12.2.0.1.0) for Microsoft Windows (32-bit)

  1. 安装 Oracle

  2. 了解您使用的是 PHP (TS) 线程安全版本还是 PHP (NTS) 非线程安全版本。为此,请使用以下代码:

<?php phpinfo(); ?>

Screenshot of phpinfo for TS version

Screenshot of phpinfo for NTS version

如果在Zend Extension Build 的值中找到TS,则说明您使用的是线程安全(TS) 版本的PHP。

如果在Zend Extension Build 的值中找到NTS,则说明您使用的是非线程安全 (NTS) 版本的 PHP。

  1. 下载最新版本的 PHP OCI8 扩展 DLL。为此,请转到https://pecl.php.net/package/oci8,然后单击DLL 链接,其中Downloads 列中的Windows 图标与您需要的DLL 版本相对应。

对于 PHP 版本 5.3、5.4、5.5 和 5.6,最新版本为 2.0.12

对于 PHP 7.0,版本为 2.1.8

对于 PHP 7.1、7.2、7.3,版本为 2.2.0

然后,继续下载与您的PHP版本和架构对应的存档:如果您使用PHP 7.2 x86 TS,请下载相应的文件:7.2 Thread Safe (TS) x86

  1. 将下载的文件解压缩到您的 PHP 安装文件夹的 ext 文件夹中。用新文件替换旧文件。

  2. 在您的 php.ini 文件中启用 PHP OCI8 扩展。

如果您安装了 Oracle 11g,则需要将以下行添加到您的 php.ini 文件中:

ext=php_oci8_11g.dll

如果您安装了 Oracle 12c,则需要将以下行添加到您的 php.ini 文件中:

ext=php_oci8_12c.dll

注意:只能同时启用 3 个可用的 PCP OCI8 扩展之一。如果您有多行以ext=php_oci8 开头,请检查是否仅启用了一行。禁用的行以分号开头。如果您发现多行,请删除或注释(在行首添加分号)该行。

【讨论】:

  • 非常棒的答案。这对我帮助很大。谢谢!
【解决方案2】:

几个月后,我找到了解决方案。考虑以下基础架构:

  • Windows Server 2012 R2 标准版 x64
  • Apache/2.4.18 (Win64) VC11
  • PHP 5.6.19 x86 VC11 TS

下载 Oracle Instant Client 时请注意:

  • 无论您的服务器是 x64 还是 x86 架构,都必须下载 32 位版本
  • 如您所见,PHP 是在 VC11 中编译的,因此您必须下载带有 VC11 源的 OIC,这可以确认解压缩下载的文件并检查文件夹 vc11 是否存在。

这两个细节都非常重要。一旦我满足这两个要求,错误就消失了,我现在可以通过 PHP 成功连接到 Oracle

【讨论】:

  • 遇到了类似的问题,但即使按照您的解决方案,仍然收到相同的错误消息。不过,我使用的是 Windows 10。
  • 如果你的 PHP 是 NTS(非线程安全),你也必须使用 oci8 NTS。 TS也一样。使用php -v 显示此信息。
猜你喜欢
  • 2013-12-07
  • 2013-11-03
  • 2017-04-16
  • 2012-07-03
  • 2019-03-02
  • 2021-10-15
  • 2011-06-23
  • 2017-03-28
相关资源
最近更新 更多