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

Gra*_*ham 8 php oracle oracle-call-interface oracle11g

我有一个简单的PHP脚本:

<?php
$db_user = 'myusername';
$db_pass = 'mypassword';
$db_sid = 'mysid';
$conn = oci_connect( $db_user, $db_pass, $db_sid );
?>
Run Code Online (Sandbox Code Playgroud)

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

Call to undefined function oci_connect
Run Code Online (Sandbox Code Playgroud)

我正在使用PHP 5.6.6,它已经附带了php_oci8_12c.dll.

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

我已经安装了即时客户端(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)
    )
  )
Run Code Online (Sandbox Code Playgroud)

我还从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 
Run Code Online (Sandbox Code Playgroud)

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

理想情况下,我希望使用oci 1.4.10来匹配生产服务器,但现在不要太担心.

pear install oci8-1.4.10.tgz
Run Code Online (Sandbox Code Playgroud)

给我这个错误:

The DSP oci8.dsp does not exist
Run Code Online (Sandbox Code Playgroud)

我找不到任何关于那个对我来说意味着什么的错误的解释.

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

编辑:

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

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

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

编辑:

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

Loaded Configuration File => C:\php5.6.6\php.ini
Run Code Online (Sandbox Code Playgroud)

来自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"
Run Code Online (Sandbox Code Playgroud)

编辑:

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

编辑:

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

tim*_*ton 11

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

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


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

  • 下载并解压缩PHP(我使用C:\phpphp-5.6.7-nts-Win32-VC11-x86.zip).
  • 下载并提取InstantClient(我使用C:\instantclient_12_1instantclient-basic-nt-12.1.0.2.0.zip).
  • 将上述路径添加到系统路径.
  • 复制c:\php\php.ini-productionc:\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
Run Code Online (Sandbox Code Playgroud)

并检查oci_connect功能:

C:\>php -r "var_dump(function_exists('oci_connect'));"
bool(true)
Run Code Online (Sandbox Code Playgroud)