调用未定义的函数oci_connect、php_oci8_12c.dll、windows 8.1、php5.6.6


Call to undefined function oci_connect, php_oci8_12c.dll, windows 8.1, php5.6.6

我有一个简单的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

我使用的是php5.6.6,它已经包含了php_oci8_12c.dll。

我的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)
    )
  )

我还从下载了SQLDeveloperhttp://www.oracle.com/technetwork/developer-tools/sql-developer/downloads/index.html

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 

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

理想情况下,我希望使用oci1.4.10来匹配生产服务器,但目前不太担心。

pear install oci8-1.4.10.tgz

给我这个错误:

The DSP oci8.dsp does not exist

我找不到对那个错误有任何意义的解释。

我错过了什么?有人能帮我吗?

编辑:

我在stackoverflow的其他帖子中尝试了各种建议,即:

带和不带extension=php_oci8_12c.dllextension=oci8.so

我的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应用程序

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

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


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

  • 下载并提取PHP(我使用了php-5.6.7-nts-Win32-VC11-x86.zip中的C:'php
  • 下载并提取InstantClient(我使用了instantclient-basic-nt-12.1.0.2.0.zip中的C:'instantclient_12_1
  • 将以上路径添加到系统路径中
  • c:'php'php.ini-production复制到c:'php'php.ini
  • php.ini中:
    • 使能线路CCD_ 14
    • 使能线路CCD_ 15
  • 安装Microsoft Visual C++2010运行时(x86)。OCI8扩展需要这样做
  • 安装Microsoft Visual C++2012 Runtime(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 CLI方面的内容,因为有些人需要在CLI模式下运行启用OCI的应用程序。在我的案例中,我必须将oci.dll的一个实例复制到php --ri oci8wamp/bin/php/php<version>/文件夹中,以表明oci8已正确加载。这并不能证明正确运行一个完整的应用程序不需要其他文件(请参阅我的技术脚注)。包括到instantclient12分发的路径是不行的

技术说明:我的环境是:Windows 7+WAMP3(php 5.6.5,apache 2.4.17),经过多次实验,我能够缩小需要从instantclient 12分发版复制到bin目录(非cli应用程序的apache)的最小三个文件集,以允许在Zend Framework中实例化Oracle适配器,执行SQL查询并读取记录集

该集合为:oci.dlloraociei12.dllorans.dll

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