【问题标题】:Call to undefined function oci_connect, php_oci8_12c.dll, windows 8.1, php5.6.6调用未定义函数 oci_connect、php_oci8_12c.dll、windows 8.1、php5.6.6
【发布时间】:2015-05-29 06:07:47
【问题描述】:

我有一个简单的 php 脚本:

<?php
$db_user = 'myusername';
$db_pass = 'mypassword';
$db_sid = 'mysid';
$conn = oci_connect( $db_user, $db_pass, $db_sid );
?>

当我(从浏览器或命令行)运行它时,我得到了错误:

Call to undefined function oci_connect

我正在使用 php_oci8_12c.dll 附带的 php 5.6.6。

我的 php.ini 中有 extension=php_oci8_12c.dll

我已经安装了即时客户端 (12.1) - 尝试了 32 位版本和 64 位版本

我有 ORACLE_HOME 和 TNS_ADMIN 环境变量指向即时客户端文件夹 ( C:\instantclient_12_1 )。

我的路径中也有 C:\instantclient_12_1

我在同一个文件夹中有一个 tnsnames.ora,其中包含以下相关条目:

MYSID =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = myhost.net)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = MYSERVICE)
    )
  )

我也从http://www.oracle.com/technetwork/developer-tools/sql-developer/downloads/index.html下载了SQLDeveloper

SQLDeveloper 工作,识别上述 tnsnames.ora 并连接并成功在我的 php 脚本试图访问的同一数据库上运行查询。

我在几天内花了几个小时尝试不同的事情,但无济于事。

我正在使用:

php 5.6.6
windows 8.1
IIS (so no answers involving apache please)
cmd (run as administrator)
Oracle Database 11g Enterprise Edition 11.2.0.3.0 

其他一些可能有用的信息:

理想情况下,我希望使用 oci 1.4.10 来匹配生产服务器,但暂时不用太担心。

pear install oci8-1.4.10.tgz

给我这个错误:

The DSP oci8.dsp does not exist

我找不到任何对我来说意义重大的错误解释。

我错过了什么 - 任何人都可以帮助我

编辑:

我已经尝试过stackoverflow其他帖子中的各种建议,即:

extension=oci8.so 有和没有extension=php_oci8_12c.dll

我的 php.ini 文件中没有 extension=php_oracle.dll

编辑:

phpinfo 告诉我我使用了正确的 php.ini 文件:

Loaded Configuration File => C:\php5.6.6\php.ini

phpinfo 中的这一行也可能有用:

Configure Command => cscript /nologo configure.js  "--enable-snapshot-build" "--enable-debug-pack" "--disable-zts" "--disable-isapi" "--disable-nsapi" "--without-mssql" "--without-pdo-mssql" "--without-pi3web" "--with-pdo-oci=c:\php-sdk\oracle\x86\instantclient_12_1\sdk,shared" "--with-oci8-12c=c:\php-sdk\oracle\x86\instantclient_12_1\sdk,shared" "--with-enchant=shared" "--enable-object-out-dir=../obj/" "--enable-com-dotnet=shared" "--with-mcrypt=static" "--without-analyzer" "--with-pgo"

编辑:

似乎 dsp 文件是 VC++ 项目文件 - 我现在正在冒险学习如何创建一个 php 扩展,希望当我完成后我将有足够的知识将 oci8 1.4.10 源代码编译成一个适用于 Windows 8 的 dll - 除非有人用这个问题的答案来救我 - 这看起来需要我一些时间:-)

编辑:

display_startup_errors = On 添加到 php.ini 告诉我 oci dll 不是有效的 Win32 应用程序

【问题讨论】:

  • 请查看链接:- stackoverflow.com/questions/22478387/…。 (第二个答案)。或stackoverflow.com/questions/8635881/…。 (第一个答案)
  • 检查您的路径中是否有msvcr71.dll 的副本。
  • 过去没有 - 现在 - 没有区别
  • 在命令提示符下运行php --ri oci8的结果是什么?如果您可以提供 PHP 的包名称(或下载链接)和您正在使用的即时客户端,我将尝试重现该问题。
  • php --ri oci8 给我Extension 'oci8' not present

标签: php oracle oracle11g oracle-call-interface


【解决方案1】:

编辑: 嗯。在 Windows 8 上尝试此操作似乎会生成与您指定的相同的错误。我目前正在调查...

我的错误(我启用了错误的extension_dir 行)。它在 Win8 中工作,如下所述。


以下步骤应该是让 OCI 与 PHP 一起工作所需的全部内容(我刚刚在新安装的 Windows 2008 R2 Standard x64 虚拟机上验证了这一点):

  • 下载并解压PHP(我使用C:\php from php-5.6.7-nts-Win32-VC11-x86.zip)。
  • 下载并提取 InstantClient(我使用 C:\instantclient_12_1 来自 instantclient-basic-nt-12.1.0.2.0.zip)。
  • 将上述路径添加到系统路径中。
  • c:\php\php.ini-production复制到c:\php\php.ini
  • php.ini:
    • 启用线路extension_dir = "ext"
    • 启用线路extension=php_oci8_12c.dll
  • 安装 Microsoft Visual C++ 2010 运行时 (x86)。这是 OCI8 扩展所必需的。
  • 安装 Microsoft Visual C++ 2012 运行时 (x86)。这是 PHP 所需要的。

此时在命令提示符下运行 php --ri oci8 会显示以下输出:

C:\>php --ri oci8

oci8

OCI8 Support => enabled
OCI8 DTrace Support => disabled
OCI8 Version => 2.0.9
Revision => $Id: f5a3ee1083d1ffa6adb5143efda6eafa210b8414 $
Oracle Run-time Client Library Version => 12.1.0.2.0
Oracle Compile-time Instant Client Version => 12.1

Directive => Local Value => Master Value
oci8.max_persistent => -1 => -1
oci8.persistent_timeout => -1 => -1
oci8.ping_interval => 60 => 60
oci8.privileged_connect => Off => Off
oci8.statement_cache_size => 20 => 20
oci8.default_prefetch => 100 => 100
oci8.old_oci_close_semantics => Off => Off
oci8.connection_class => no value => no value
oci8.events => Off => Off

Statistics =>
Active Persistent Connections => 0
Active Connections => 0

并检查oci_connect 函数:

C:\>php -r "var_dump(function_exists('oci_connect'));"
bool(true)

【讨论】:

  • 当您努力尝试重现我的问题时,我至少可以尝试全新安装,看看会发生什么 - 重命名我的 php 和即时客户端文件夹 - 重命名注册表项 - 下载再次文件 - 卸载 VC++ 运行时 - 按照你的指示 - 我真的很有希望 - 至少这次我在运行 php --ri oci8 时收到不同的错误消息 - oci.dll 丢失。将 oci.dll 从重命名的文件夹复制到 c:\php - 现在回到第一方 - 另一点 - 我必须添加行 extension=php_oci8_12c.dll 而不是启用它 - 感谢您的尝试
  • 您的 VC++ 运行时是从哪里获得的 - 这是唯一可能不同的东西?
  • 我很困惑为什么您需要将oci.dll 复制到 PHP 文件夹。只要路径设置正确,它就应该“正常工作”。 oci.dll 依赖于 Instantclient 文件夹中的其他文件,因此仅将其复制到 PHP 文件夹是行不通的。
  • 我使用这个MS support 页面来查找最新的VC 运行时版本。
  • 太好了,很高兴我能帮上忙。祝你好运!
【解决方案2】:

除了所说的解决问题的方法外,我还想添加 php CLI 方面的内容,因为有些人需要在 CLI 模式下运行启用 OCI 的应用程序。就我而言,我必须将oci.dll 的一个实例复制到wamp/bin/php/php&lt;version&gt;/ 文件夹中以供php --ri oci8 显示oci8 已正确加载。这并不能证明不需要其他文件来正确运行成熟的应用程序(请参阅我的技术脚注)。 包括 Instantclient 12 发行版的路径是不行的。

技术说明: 我的环境是:Windows 7 + WAMP3(php 5.6.15,apache 2.4.17),经过多次实验,我能够缩小需要复制到 bin 目录(Apache 的用于非 cli 应用程序)从 Instantclient 12 发行版,以允许在 Zend 框架内实例化 Oracle 适配器,执行 SQL 查询并读取记录集。

这组是:oci.dlloraociei12.dllorans.dll

特别是,仅复制 oci.dll 将不允许应用程序工作(引发未知异常)

【讨论】:

  • 第三个文件可以是oraons.dll吗?
  • 绝对!我的错。它是oraons.dll。抱歉耽搁了,我今天才注意到你的评论。
猜你喜欢
  • 2017-04-12
  • 2014-04-24
  • 1970-01-01
  • 1970-01-01
  • 2011-12-22
  • 2017-05-29
  • 1970-01-01
  • 2015-11-17
相关资源
最近更新 更多